C Erros Comuns
Quando algo dá errado, o C fala inglês, em frases curtas e às vezes misteriosas. Esta página junta as mensagens que você mais vai ver, em três momentos: na compilação (o gcc), na ligação (o ld) e na execução (o seu programa caindo). Cada uma vem com o que ela quer dizer, como consertar e a aula onde o assunto é explicado. Todas foram provocadas de verdade.
- Copie um pedaço da mensagem que apareceu para você (por exemplo,
undeclared) e procure aqui com Ctrl+F. - Os programas ficam na pasta
~/c/errosda Ana e foram compilados com o comando padrão do guia:gcc -std=c23 -Wall -Wextra arquivo.c -o programa. No seu computador, o nome do arquivo e o número da linha serão outros; o texto da mensagem é o mesmo. - As mensagens do gcc saem em inglês, com aspas tipográficas ‘assim’. As do ligador e do terminal saem em português na máquina da Ana, porque esses programas têm tradução instalada; a versão em inglês aparece ao lado, porque é a que você vai achar nos fóruns.
- O editor do guia usa o Clang, não o gcc: as mensagens dizem a mesma coisa com outras palavras. Por isso, cada tabela tem as duas colunas. Veja também O Editor do Guia.
Atalhos: Ler uma mensagem · Compilação, ligação ou execução? · Erros de compilação · Avisos · Erros de ligação · Erros do terminal · Erros de execução · Códigos de saída · Experimente
Como ler uma mensagem do gcc
#include <stdio.h>
int main(void) {
int idade = 29;
printf("%d\n", idad);
return 0;
}
$ gcc -std=c23 -Wall -Wextra e01.c -o e01
e01.c: In function ‘main’:
e01.c:5:20: error: ‘idad’ undeclared (first use in this function); did you mean ‘idade’?
5 | printf("%d\n", idad);
| ^~~~
| idade
e01.c:5:20: note: each undeclared identifier is reported only once for each function it appears in
e01.c:4:9: warning: unused variable ‘idade’ [-Wunused-variable]
4 | int idade = 29;
| ^~~~~
| Pedaço | O que quer dizer |
|---|---|
e01.c: In function ‘main’: | Contexto: "dentro da função main". Não é um erro; diz onde estão os próximos. |
e01.c:5:20: | arquivo:linha:coluna. Linha 5, coluna 20. Os editores de código pulam direto para lá. |
error: | O tipo. error impede o programa de ser criado; warning (aviso) deixa criar, mas aponta algo suspeito; note (nota) é uma informação extra sobre a mensagem de cima; fatal error para tudo na hora. |
‘idad’ undeclared (first use in this function) | O texto: "idad não foi declarada (primeiro uso nesta função)". |
did you mean ‘idade’? | Uma sugestão: "você quis dizer idade?". Embaixo do código, a linha idade mostra como ficaria. |
5 | printf(…); | ^~~~ | A linha do código, com o ^ apontando a coluna e os ~ sublinhando o trecho. |
[-Wunused-variable] | O nome do aviso, isto é, a opção que o liga. Útil para procurar na internet. |
Conserte sempre o primeiro erro primeiro. Um erro costuma provocar outros em cascata: aqui, o aviso unused variable ‘idade’ só existe por causa do erro de digitação. E o erro de verdade pode estar antes da linha apontada (um ; que faltou na linha de cima, por exemplo). Aula: Lendo Erros do Compilador.
Compilação, ligação ou execução?
| Fase | Quem reclama | Como reconhecer | O programa existe? | Aula |
|---|---|---|---|---|
| Compilação | o compilador (gcc, cc1) | arquivo.c:linha:coluna: error: | não | Lendo Erros |
| Ligação | o ligador (ld), chamado pelo gcc | referência não definida para (undefined reference to) e, no fim, collect2: error: ld returned 1 exit status; não há número de linha | não | Como o C Vira Programa |
| Execução | o sistema, ou a biblioteca C | o programa começa, e então aparece Falha de segmentação, Abortado, ***… | sim, e caiu | Depurar com gdb |
| Terminal | o bash | bash: … (nem chegou a rodar o seu programa) | talvez | Compilar com gcc |
Erros de compilação
Cada linha desta tabela é um programa pequeno, provocado de propósito. A coluna do gcc mostra só o texto principal (sem arquivo:linha:coluna).
| Código com o erro | gcc 15 | Clang (editor) | O que significa e como consertar | Aula |
|---|---|---|---|---|
printf("%d\n", idad); | ‘idad’ undeclared (first use in this function); did you mean ‘idade’? | use of undeclared identifier 'idad'; did you mean 'idade'? | Nome que não existe: erro de digitação, variável declarada depois ou dentro de outro bloco. Confira a grafia (maiúsculas contam). | Variáveis |
int preco = 10(sem ;) | expected ‘,’ or ‘;’ before ‘printf’ (aponta a linha seguinte) | expected ';' at end of declaration | Faltou o ; no fim da linha de cima. | Sintaxe |
dobro(4) antes de int dobro(int n) {…} | implicit declaration of function ‘dobro’ [-Wimplicit-function-declaration] | use of undeclared identifier 'dobro' | A função foi usada antes de ser declarada. Ponha um protótipo (int dobro(int n);) antes do main, ou a função inteira. | Protótipos |
printf sem #include <stdio.h> | implicit declaration of function ‘printf’ + note: include ‘<stdio.h>’ or provide a declaration of ‘printf’ | call to undeclared library function 'printf' with type 'int (const char *, ...)' + note: include the header <stdio.h> | Faltou o #include. Os dois dizem qual. | Arquivos .h |
um { sem o } | expected declaration or statement at end of input | expected '}' + note: to match this '{' | O arquivo acabou com uma chave aberta. Conte as chaves; um editor com indentação automática ajuda a ver qual ficou sem par. | Sintaxe |
printf("%d\n", (2 + 3); | expected ‘)’ before ‘;’ token | expected ')' + note: to match this '(' | Parêntese aberto e não fechado. | Sintaxe |
printf("Olá, mundo!\n); | missing terminating " character | missing terminating '"' character + expected expression | Faltou fechar as aspas. | Escapes |
printf(“Olá”);(aspas curvas, copiadas de um site ou de um documento) | stray ‘\342’ in program | unexpected character <U+201C> | "Caractere perdido": as aspas “ ” não são as " do C. Apague e digite de novo no editor de código. | Acentos e UTF-8 |
string nome = "Ana"; | unknown type name ‘string’; did you mean ‘stdin’? | use of undeclared identifier 'string'; did you mean 'stdin'? | O C não tem tipo string (isso é de outras linguagens). Use char nome[] = "Ana";. | Strings |
char nome[20]; nome = "Ana"; | assignment to expression with array type | array type 'char[20]' is not assignable | Não se atribui um array com =. Inicialize na declaração (char nome[20] = "Ana";) ou copie: snprintf(nome, sizeof nome, "%s", "Ana"). | Funções de String |
int idade = "29"; | initialization of ‘int’ from ‘char *’ makes integer from pointer without a cast [-Wint-conversion] | incompatible pointer to integer conversion initializing 'int' with an expression of type 'char[3]' | "29" é texto. Escreva 29, ou converta com strtol. | Texto ↔ Número |
dobrar(x); com void dobrar(int *p) | passing argument 1 of ‘dobrar’ makes pointer from integer without a cast + note: possible fix: take the address with ‘&’ | incompatible integer to pointer conversion passing 'int' to parameter of type 'int *'; take the address with & | A função quer um endereço: dobrar(&x). | Passar por Ponteiro |
int *p = &preco; com double preco | initialization of ‘int *’ from incompatible pointer type ‘double *’ [-Wincompatible-pointer-types] | incompatible pointer types initializing 'int *' with an expression of type 'double *' | O ponteiro tem de ser do tipo da variável: double *p. | Ponteiros |
soma(1), soma(1, 2, 3) com int soma(int a, int b) | too few arguments to function ‘soma’; expected 2, have 1 / too many arguments… | too few arguments to function call, expected 2, have 1 / too many… | Passe exatamente os parâmetros que a função pede. | Parâmetros |
int area(int lado); e depois int area(double lado) {…} | conflicting types for ‘area’; have ‘int(double)’ + note: previous declaration of ‘area’ with type ‘int(int)’ | conflicting types for 'area' | O protótipo e a função não batem. Deixe os dois iguais. | Protótipos |
return n; numa função void; return; numa função int | ‘return’ with a value, in function returning void [-Wreturn-mismatch] / ‘return’ with no value, in function returning non-void | void function 'mostrar' should not return a value / non-void function 'calcular' should return a value | O return não combina com o tipo da função. | Valor de Retorno |
int total = 0; duas vezes no mesmo bloco | redefinition of ‘total’ | redefinition of 'total' | Declare uma vez só; depois, só atribua (total = 5;). | Escopo |
5 = x; | lvalue required as left operand of assignment | expression is not assignable | À esquerda do = tem de haver um lugar para guardar (uma variável). Talvez você quisesse x = 5 ou x == 5. | Atribuição |
limite = 20; com const int limite | assignment of read-only variable ‘limite’ | cannot assign to variable 'limite' with const-qualified type 'const int' | Uma constante não muda. Tire o const se ela precisa mudar. | Constantes |
break; dentro de um if, fora de laço | break statement not within loop or switch | 'break' statement not in loop or switch statement | break só sai de laços e de switch. Para sair de uma função, return. | break e continue |
dois case 1: no mesmo switch | duplicate case value | duplicate case value '1' | Cada case precisa de um valor diferente. | switch |
duas linhas num if sem chaves, depois else | ‘else’ without a previous ‘if’ (e antes, o aviso this ‘if’ clause does not guard...) | expected expression (e o aviso misleading indentation) | Sem chaves, o if só pega a primeira linha. Use sempre { }. | if e else |
p.x com struct ponto *p | ‘p’ is a pointer; did you mean to use ‘->’? | member reference type 'struct ponto *' is a pointer; did you mean to use '->'? | Com ponteiro, use p->x. | Structs e Ponteiros |
struct produto item; só com struct produto; declarada | storage size of ‘item’ isn’t known | variable has incomplete type 'struct produto' | A struct foi anunciada mas não definida (faltam os campos, ou falta o #include do .h que a define). | Structs |
nome + sobrenome com dois char * | invalid operands to binary + (have ‘char *’ and ‘char *’) | invalid operands to binary expression ('char *' and 'char *') | Não se juntam strings com +. Use snprintf ou strcat. | string.h |
nota[0] com int nota | subscripted value is neither array nor pointer nor vector | subscripted value is not an array, pointer, or vector | Os colchetes só valem para arrays e ponteiros. | Arrays |
int v[n] = {0}; com n variável | variable-sized object may not be initialized except with an empty initializer | variable-sized object may not be initialized | Um array de tamanho variável (VLA) só aceita = {} C23, ou um laço que zere. | Arrays |
#include <stdioh> | fatal error: stdioh: Arquivo ou diretório inexistente + compilation terminated. | fatal error: 'stdioh' file not found | O cabeçalho não existe: nome errado (aqui, faltou o .) ou biblioteca não instalada. Num .h seu, use aspas: #include "loja.h". | Pré-processador |
bool ok = true; com -std=c17 | unknown type name ‘bool’ + note: ‘bool’ is defined in header ‘<stdbool.h>’; this is probably fixable by adding ‘#include <stdbool.h>’ | use of undeclared identifier 'bool' | Antes do C23, bool, true e false precisam de #include <stdbool.h> (e nullptr não existe). Com -std=c23, ou sem -std no gcc 15, funcionam direto. | bool |
- Leia só a primeira mensagem
error:e olhe a linha dela e a de cima. - Copie o texto da mensagem (sem o nome do arquivo e os números) e procure nesta página ou na internet.
- Comente metade do código (
/* … */) e compile de novo, até achar a linha culpada.
Avisos (warning)
Um aviso não impede o programa de ser criado, mas quase sempre aponta um bug. Compile sempre com -Wall -Wextra, e trate cada aviso como erro (a opção -Werror faz isso de verdade). Este programa junta os avisos mais comuns:
#include <stdio.h>
int maior(int a, int b) {
if (a > b) {
return a;
}
}
int *criar(void) {
int local = 7;
return &local;
}
int main(int argc, char *argv[]) {
int sobra;
int x;
printf("%d\n", x);
x == 5;
if (x > 5);
{
printf("maior\n");
}
int opcao = 1;
switch (opcao) {
case 1:
printf("um\n");
case 2:
printf("dois\n");
break;
}
if (x > 0)
printf("a\n");
printf("b\n");
printf("%d %p\n", maior(1, 2), (void *)criar());
return 0;
}
| Código | gcc 15 | Clang (editor) | O que significa e como consertar | Aula |
|---|---|---|---|---|
int sobra; nunca usada | unused variable ‘sobra’ [-Wunused-variable] | unused variable 'sobra' [-Wunused-variable] | Sobrou do código antigo, ou você usou outro nome por engano. Apague. | Avisos |
printf("%d\n", x); sem valor em x | ‘x’ is used uninitialized [-Wuninitialized] | variable 'x' is uninitialized when used here [-Wuninitialized] | A variável tem lixo. Inicialize: int x = 0;. | Variáveis |
int main(int argc, char *argv[]) sem usá-los | unused parameter ‘argc’ [-Wunused-parameter] | unused parameter 'argc' [-Wunused-parameter] | Se não usa, escreva int main(void). | Argumentos |
maior sem return no fim | control reaches end of non-void function [-Wreturn-type] | non-void function does not return a value in all control paths [-Wreturn-type] | Num dos caminhos, a função acaba sem devolver nada (e quem chamou recebe lixo). Ponha um return no fim. | Valor de Retorno |
return &local; | function returns address of local variable [-Wreturn-local-addr] | address of stack memory associated with local variable 'local' returned [-Wreturn-stack-address] | A variável local some quando a função termina; o endereço fica apontando para o nada. Use malloc ou receba um ponteiro de quem chama. | Pilha e Heap |
x == 5; sozinho | statement with no effect [-Wunused-value] | equality comparison result unused [-Wunused-comparison] + note: use '=' to turn this equality comparison into an assignment | Você quis x = 5;. | Comparação |
if (x > 5); | suggest braces around empty body in an ‘if’ statement [-Wempty-body] | if statement has empty body [-Wempty-body] | O ; logo depois do if é o corpo dele (vazio): o bloco de baixo roda sempre. Tire o ;. | if e else |
case 1: sem break | this statement may fall through [-Wimplicit-fallthrough=] | (nenhum aviso) | O case 1 continua no case 2 e mostra um e dois. Ponha break;, ou [[fallthrough]]; C23 se for de propósito. | switch |
duas linhas indentadas sob um if sem chaves | this ‘if’ clause does not guard... [-Wmisleading-indentation] | misleading indentation; statement is not part of the previous 'if' [-Wmisleading-indentation] | A segunda linha não está dentro do if, apesar do recuo. Use chaves. | if e else |
printf("%d", preco) com double | format ‘%d’ expects argument of type ‘int’, but argument 2 has type ‘double’ [-Wformat=] | format specifies type 'int' but the argument has type 'double' [-Wformat] | Formato e valor não combinam. Tabela completa: printf e scanf. | Formatos |
if (idade = 18) | suggest parentheses around assignment used as truth value [-Wparentheses] | using the result of an assignment as a condition without parentheses | Comparar é ==. Mais armadilhas de operadores: Operadores. | Comparação |
i < strlen(s) com int i | comparison of integer expressions of different signedness: ‘int’ and ‘size_t’ {aka ‘long unsigned int’} [-Wsign-compare] | (nenhum aviso) | int × sem sinal: um negativo vira um número enorme. Use size_t i. Veja Tipos e Limites. | Conversão |
free(v); free(v); | pointer ‘v’ used after ‘free’ [-Wuse-after-free] | (nenhum aviso) | Depois do free, o ponteiro não vale mais. Faça v = NULL; logo depois. | malloc e free |
| uma função que chama a si mesma sempre | infinite recursion detected [-Winfinite-recursion] | all paths through this function will call itself [-Winfinite-recursion] | Falta o caso base (o if que para a recursão). | Recursão |
Erros de ligação (o ld)
O compilador transforma cada .c num arquivo-objeto (.o); o ligador junta tudo, com as bibliotecas, num executável. Os erros dele não têm número de linha e terminam sempre com collect2: error: ld returned 1 exit status ("o ld terminou com o código 1"). Aula: Como o C Vira Programa.
$ gcc -std=c23 -Wall -Wextra l01.c -o l01 « l01.c declara int soma(int a, int b); mas não a define /usr/bin/x86_64-linux-gnu-ld.bfd: /tmp/ccOoraNE.o: na função "main": l01.c:(.text+0x13): referência não definida para "soma" collect2: error: ld returned 1 exit status $ gcc -std=c23 -Wall -Wextra l02.c -o l02 « escreveu int Main(void) /usr/bin/x86_64-linux-gnu-ld.bfd: /usr/lib/gcc/x86_64-linux-gnu/15/../../../x86_64-linux-gnu/Scrt1.o: na função "_start": (.text+0x1b): referência não definida para "main" collect2: error: ld returned 1 exit status $ gcc -std=c23 -Wall -Wextra l03.c -o l03 « usa sqrt(x) do math.h /usr/bin/x86_64-linux-gnu-ld.bfd: /tmp/ccezM8a9.o: na função "main": l03.c:(.text+0x23): referência não definida para "sqrt" collect2: error: ld returned 1 exit status $ gcc -std=c23 -Wall -Wextra l03.c -o l03 -lm $ ./l03 1.414 $ gcc -std=c23 -Wall -Wextra l04a.c l04b.c -o l04 « os dois arquivos têm int contador = 0; /usr/bin/x86_64-linux-gnu-ld.bfd: /tmp/ccWgCA1M.o:(.bss+0x0): múltiplas definições de "contador"; /tmp/cc7vaz22.o:(.bss+0x0): definido primeiro aqui collect2: error: ld returned 1 exit status $ gcc -std=c23 -Wall -Wextra l01.c -o l01 -lfoo /usr/bin/x86_64-linux-gnu-ld.bfd: não foi possível localizar -lfoo: Arquivo ou diretório inexistente collect2: error: ld returned 1 exit status
Mensagem do ld (português / inglês) | No editor | O que significa e como consertar | Aula |
|---|---|---|---|
referência não definida para "soma"undefined reference to `soma' | wasm-ld: error: …: undefined symbol: soma + clang: error: linker command failed with exit code 1 | A função foi declarada (protótipo) mas ninguém a escreveu, ou o .c que a tem não entrou no comando. Escreva a função ou ponha todos os .c: gcc main.c loja.c -o loja. | Vários Arquivos |
referência não definida para "main" | compila, e o programa cai com Falha de segmentação (139) | Não há função main: nome errado (Main, mian) ou o arquivo certo não entrou no comando. | Olá, Mundo |
referência não definida para "sqrt" | funciona (o editor não precisa de -lm) | As funções do math.h ficam na biblioteca libm: acrescente -lm no fim do comando. | Matemática |
múltiplas definições de "contador"; … definido primeiro aquimultiple definition of `contador' | wasm-ld: error: duplicate symbol: contador | Dois .c definem a mesma variável global (ou função). Defina em um só; no outro, e no .h, declare com extern int contador;. | static e extern |
não foi possível localizar -lfoocannot find -lfoo | — | A biblioteca libfoo não está instalada, ou o nome está errado. Instale o pacote de desenvolvimento dela (libfoo-dev) ou indique a pasta com -L. | Bibliotecas |
Outras mensagens do gcc
$ gcc -std=c23 -Wall -Wextra nao-existe.c -o x cc1: fatal error: nao-existe.c: Arquivo ou diretório inexistente compilation terminated. $ gcc gcc: fatal error: no input files compilation terminated.
O arquivo não está nesta pasta (confira com ls e pwd) ou o nome está errado; e o gcc precisa de pelo menos um arquivo. Aula: Compilar com gcc.
Erros do terminal (o bash)
$ ./e01 « o e01.c tinha erro: o programa não foi criado bash: ./e01: Arquivo ou diretório inexistente $ ./l03 « o arquivo perdeu a permissão de execução bash: ./l03: Permissão negada $ ola « faltou o ./ bash: ola: comando não encontrado
| Mensagem (português / inglês) | O que significa e como consertar | Aula |
|---|---|---|
Arquivo ou diretório inexistenteNo such file or directory | O programa não existe: a compilação falhou (role para cima e leia o erro) ou o nome depois do -o é outro. | Compilar |
Permissão negadaPermission denied | O arquivo não é executável: você tentou rodar o .c (./ola.c) em vez do programa, ou ele perdeu a permissão (chmod +x programa). | Compilar |
comando não encontradocommand not found | Para rodar um programa da pasta atual, escreva ./ antes: ./ola. Se for o próprio gcc, ele não está instalado. | Instalar no Linux |
Erros de execução
O programa compilou, começou a rodar e caiu. Aqui, a mensagem vem do sistema ou da biblioteca C, sem número de linha. Para achar a linha, use o gdb, os sanitizers (-fsanitize=address) ou o Valgrind. As saídas abaixo são do terminal da Ana (-t, terminal de verdade):
$ ./r1 « int *p = NULL; *p = 5;
Vou escrever no endereço nulo...
Falha de segmentação (imagem do núcleo gravada) ./r1
$ echo "código: $?"
código: 139
$ ./r3 « assert(estoque >= 0); com estoque = -2
r3: r3.c:6: main: Assertion `estoque >= 0' failed.
Abortado (imagem do núcleo gravada) ./r3
$ ./r4 « free(v); free(v);
free(): double free detected in tcache 2
Abortado (imagem do núcleo gravada) ./r4
$ ./r6 « free num array que não veio do malloc
free(): invalid pointer
Abortado (imagem do núcleo gravada) ./r6
$ ./r7 « recursão sem fim
Falha de segmentação (imagem do núcleo gravada) ./r7
$ echo AnaSouzaDaSilva | ./r5 « scanf("%s", nome) num char nome[8]
Nome: Olá, AnaSouzaDaSilva!
*** stack smashing detected ***: terminated
Abortado (imagem do núcleo gravada) echo AnaSouzaDaSilva | ./r5
| Mensagem (português / inglês) | Causas comuns | No editor | Como consertar | Aula |
|---|---|---|---|---|
Falha de segmentação (imagem do núcleo gravada)Segmentation fault (core dumped) | usar um ponteiro NULL (um fopen ou malloc sem teste); scanf sem &; mudar uma string literal; printf("%s") com um número; recursão sem fim (estouro da pilha) | a mesma mensagem e 139 no ponteiro nulo e na recursão; muitos dos outros casos passam calados | teste os NULL; leia os avisos do -Wall; rode no gdb para ver a linha | Ponteiro Nulo |
Exceção de ponto flutuante (imagem do núcleo gravada)Floating point exception | divisão (ou %) de inteiros por zero, apesar do nome | igual (136) | if (divisor != 0) antes da conta | Aritméticos |
Assertion `estoque >= 0' failed. + AbortadoAborted | um assert cuja condição deu falsa: é o seu programa avisando que algo "impossível" aconteceu | Assertion failed: estoque >= 0 (r3.c: main: 6) + Abortado (134) | descubra por que a condição ficou falsa (a mensagem diz o arquivo, a função e a linha) | Testes (assert) |
free(): double free detected in tcache 2 + Abortado | free duas vezes no mesmo ponteiro | passa calado (o programa termina normalmente) | free(v); v = NULL; | malloc e free |
free(): invalid pointer + Abortado | free num endereço que não veio do malloc (um array comum, ou o meio de um bloco) | passa calado | só dê free no que veio de malloc/calloc/realloc | malloc e free |
*** stack smashing detected ***: terminated + Abortado | escrever além do fim de um array local: scanf("%s") sem largura, strcpy, gets, laço que passa do fim. O gcc percebe na saída da função (repare que o Olá saiu antes) | passa calado (mostra Olá, AnaSouzaDaSilva! e termina com 0) | sempre com tamanho: %7s, fgets, snprintf | Segurança |
| o programa "trava" e não termina | laço infinito; scanf esperando a entrada; laço com scanf que não confere o retorno | para em 15 s | Ctrl+C para interromper; confira a condição do laço | while |
O WebAssembly organiza a memória de outro jeito: o free duplo, o free inválido, o estouro de array e a escrita numa string literal não derrubam o programa no editor. Isso não quer dizer que o código esteja certo: no Linux, os mesmos programas caem. Para ver esses erros de verdade, compile no seu computador com -fsanitize=address (aula Sanitizers).
Códigos de saída
Todo programa termina com um número, que o terminal guarda em $? (echo $? mostra) e que o editor mostra como [código de saída: N]. Acima de 128, é 128 + o número do sinal que matou o programa. Aula: exit e atexit.
| Código | Quer dizer | Exemplo real | Aula |
|---|---|---|---|
0 | deu certo | return 0;, exit(EXIT_SUCCESS) | exit |
1 (ou outro de 1 a 125) | o programa avisou que deu errado | return 1;, exit(EXIT_FAILURE); o próprio gcc termina com 1 quando a compilação falha | exit |
126 | o bash achou o arquivo mas não pôde executá-lo | Permissão negada | Compilar |
127 | o bash não achou o comando | comando não encontrado | Compilar |
130 | 128 + 2 (SIGINT): interrompido com Ctrl+C | um laço infinito interrompido | Sinais |
134 | 128 + 6 (SIGABRT): Abortado | abort(), assert falho, double free, stack smashing | Sinais |
136 | 128 + 8 (SIGFPE): Exceção de ponto flutuante | divisão inteira por zero | Sinais |
139 | 128 + 11 (SIGSEGV): Falha de segmentação | ponteiro nulo, recursão sem fim | Sinais |
143 | 128 + 15 (SIGTERM): Terminado | kill no programa, ou raise(SIGTERM) | Sinais |
Experimente
Missão: a Ana escreveu a conta da papelaria com pressa, e o programa nem compila. Clique em Rodar, leia a primeira mensagem de erro, conserte, rode de novo, e repita até sair Total: R$ 30, sem nenhum aviso. (São três erros; use as tabelas desta página.)
#include <stdio.h>
int main(void) {
int canetas = 3
int cadernos = 2;
int total = canetas * 4 + cadernos * 9;
printf("Total: R$ %d\n", totl);
return 0;
}
#include <stdio.h>
int main(void) {
int canetas = 3;
int cadernos = 2;
int total = canetas * 4 + cadernos * 9;
printf("Total: R$ %d\n", total);
return 0;
}
Resumo
- Compilação (
arquivo:linha:coluna: error:): conserte o primeiro erro primeiro e olhe também a linha de cima. Os mais comuns:undeclared,expected ‘;’,implicit declaration, aspas e chaves sem par. - Avisos (
warning:): quase sempre são bugs. Compile com-Wall -Wextrae deixe zero avisos. - Ligação (
referência não definida para,collect2: error: ld returned 1 exit status): falta uma função, omain, um.cno comando ou o-lm. - Execução:
Falha de segmentação(139),Abortado(134:assert,double free,stack smashing),Exceção de ponto flutuante(136). Ache a linha comgdbou-fsanitize=address. - No editor, as mensagens são do Clang, e muitos erros de memória passam calados: confira no gcc.