есть ли способ найти ошибки памяти во время компиляции в c

Предположим, в моем коде я использую что-то вроде этого

int iLen = 0;
    char *sTmpStr;

strcpy(sTmpStr, "abc");

теперь я не выделил никакого адреса для указателя. так есть ли какая-либо опция в gcc, которая покажет эту ошибку.

Я пробовал оптимизацию, но это не дало этой ошибки.

я пробовал -fsanitize=address, но во время выполнения выдавал ошибку, что-то вроде этого

==1982== ОШИБКА: AddressSanitizer: SEGV по неизвестному адресу 0x000000c38299 (pc 0x7f78d7b685b0 sp 0x7ffd8918a0b0 bp 0x7f78d7d7a668 T0)

или есть ли способ записать это o/p в файл


person Grv    schedule 21.08.2015    source источник
comment
Ошибки: Не напрямую, Предупреждение: Да. превращать предупреждения в ошибки. Надеюсь, так и будет.   -  person Sourav Ghosh    schedule 21.08.2015
comment
какую опцию я должен использовать в gcc, чтобы это отображалось как предупреждение?   -  person Grv    schedule 21.08.2015
comment
вы можете использовать clang с --analyze для получения Function call argument is an uninitialized value: stackoverflow.com/q/27063678/390913   -  person perreal    schedule 21.08.2015
comment
Все, что может сделать ваш компилятор, это выдать предупреждение, потому что вы используете неинициализированную переменную sTmpStr. Флаг компилятора -Wall должен выполнить эту работу.   -  person Jabberwocky    schedule 21.08.2015
comment
предположим, если я напишу free(sTmpStr); -Стена не показывает это как предупреждение   -  person Grv    schedule 21.08.2015
comment
Связанный вопрос: stackoverflow.com/ вопросы/399850/   -  person Klas Lindbäck    schedule 21.08.2015


Ответы (2)


Включение предупреждений компилятора очень помогает. Хороший уровень предупреждения (ИМХО) — -Wall.

Я помещаю ваш примерный код в программу, k.c:

#include<stdio.h>
int main()
{
    int iLen = 0;
    char *sTmpStr;

    strcpy(sTmpStr, "abc");
    return 0;
}

Компиляция выдала следующие предупреждения:

$ gcc -Wall k.c -o k
k.c: In function 'main':
k.c:11: warning: unused variable 'iLen'
k.c:14: warning: 'sTmpStr' is used uninitialized in this function
$

Вы можете превратить предупреждения в ошибки, добавив флаг -Werror

person Klas Lindbäck    schedule 21.08.2015

Простого использования компилятора, как правило, недостаточно для поиска ошибок во время выполнения и плохо заданного поведения. gcc -std=c11 -pedantic-errors -Wall — хорошее начало, но gcc по-прежнему остается просто компилятором, а цель компилятора — проверить, написан ли код в соответствии с требованиями стандарта. Все, что сверх этого, — просто бонус.

Профессиональным вариантом будет использование статического анализатора кода. Они будут проверять распространенные ошибки и проблемы в вашем коде. К сожалению, таких инструментов с открытым исходным кодом не существует: они, как правило, довольно дороги.

person Lundin    schedule 21.08.2015
comment
Вариант -std=c11 в этом отношении не имеет значения и вводит в заблуждение. - person fuz; 25.08.2015
comment
@FUZxxl Нет, поскольку многие вещи, поведение которых плохо определено в стандарте C, реализованы в виде языковых расширений в GNU C. Если вы не используете расширения GNU C, никогда не будет причин не использовать -std - person Lundin; 25.08.2015
comment
Я пытаюсь сказать, что вам не нужно буквально указывать -std=c11; многие проекты написаны на C89 или C99 для совместимости, и обычно не рекомендуется менять версию языка без оценки последствий. Всегда предполагайте, что люди будут копировать (и проповедовать) ваш ответ, не понимая, что означают его части. - person fuz; 25.08.2015
comment
@FUZxxl В соответствии с политикой тегов C предполагается, что все вопросы касаются текущего стандарта C, если иное не указано в OP. - person Lundin; 25.08.2015
comment
Но ваш ответ не требует установки стандартной версии C11. Если кто-то прочитает ваш ответ и не знает лучше, он может подумать, что необходимо установить -std=c11, чтобы получить приличные отчеты об ошибках. Это абсолютно неверно. - person fuz; 25.08.2015
comment
Инструмент для анализа статического кода с открытым исходным кодом можно найти на сайте Frama C. - person fuz; 25.08.2015