Мне было бы интересно узнать, возможно ли его явное заражение переменной в C как неинициализированной.Есть ли способ установить переменную как неинициализированную в GCC/Clang?
Псевдокод ...
{
int *array;
array = some_alloc();
b = array[0];
some_free(array);
TAINT_MACRO(array);
/* the compiler should raise an uninitialized warning here */
b = array[0];
}
Вот один пример одного из способов испортить переменный, но GCC поднимает предупреждение, когда «а» присваиваются неинициализированный вар, а затем второе использование «а».
{
int a = 10;
printf("first %d\n", a);
do {
int b;
a = b;
} while(0);
printf("second %d\n", a);
}
Единственное решение, которое я мог придумать, чтобы явно теневым переменные с неинициализированными один (пустоты добавляются так нет неиспользуемых предупреждений).
#define TAINT_MACRO_BEGIN(array) (void)(array); { void **array; (void)array;
#define TAINT_MACRO_END(array) } (void)(array);
{
int *array;
array = some_alloc();
b = array[0];
some_free(array);
TAINT_MACRO_BEGIN(array);
/* the compiler should raise an uninitialized warning here */
b = array[0];
TAINT_MACRO_END(array);
}
Этот метод добавляет слишком много накладных расходов включить в существующий код (добавляет много шума и раздражает поддерживать), поэтому мне было интересно, есть ли какой-то другой способ, чтобы сообщить компилятору переменная не инициализирована.
Я знаю, что есть статические шашки, и я их использую, но Im ищет что-то такое, что может дать предупреждение во время компиляции и без ложных срабатываний, которые, я считаю, возможны в этом случае и могут избежать определенного класса ошибок ,
Что делать, если указатель был освобожден в одной единицы перевода, а затем использован в другом? Компилятор не может это понять. – Collin
'some_index' не объявлен в вашем первом примере. Я ожидаю, что весь компилятор будет жаловаться на это, а не на инициализацию. – chux
Не знаете, почему вам не нравится предупреждение в вашем втором примере в 'a = b;' Компилятор, который также жаловался на последующие плохие использования ('printf (« second% d \ n », a);')) было бы подробным , Первое предупреждение будет достаточным для большей части отладки. – chux