У меня есть модульный тест С++, который выводит полезный вывод на стандартный вывод и в основном шум (если я не отлаживаю) на стандартный вывод, поэтому я хотел бы перенаправить стандартный вывод на /dev/null.
Как ни странно, это, по-видимому, вызывает ошибку сегментации.
Есть ли какая-либо причина, по которой код может ошибаться с ошибкой «> /dev/null» и в противном случае работать нормально?
Вывод производится полностью printf
s, если это имеет какое-либо значение.
Мне трудно опубликовать оскорбительный код, потому что это исследование, представленное для публикации. Я надеюсь, что есть "очевидная" возможная причина, основанная на этом описании.
после смерти
Segfault был вызван таким кодом:
ArrayElt* array = AllocateArrayOfSize(array_size);
int index = GetIndex(..) % array_size;
ArrayElt elt = array[index];
В сотый раз я забыл, что x % y
остается отрицательным, когда x
отрицательное в C/C++.
Итак, почему это происходило только тогда, когда я перенаправлялся на /dev/null
? Я предполагаю, что неверный адрес памяти, к которому я обращался, находился в выходном буфере для стандартного вывода, и этот буфер не выделяется, когда он не нужен.
Спасибо за хорошие ответы!
x % y
, когда любой операнд отрицателен, определяется реализацией, поэтому вы не можете переносимо полагаться на наблюдаемое поведение. - person CB Bailey   schedule 11.10.2009