Имам единичен тест на C++, който произвежда полезен изход към stderr и най-вече шум (освен ако не отстранявам грешки) към stdout, така че бих искал да пренасоча stdout към /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
? Предполагам, че невалидният адрес на паметта, до който имах достъп, беше в изходен буфер за stdout - и този буфер не се разпределя, когато не е необходим.
Благодаря за добрите отговори!
x % y
, когато някой от операндите е отрицателен, се дефинира от изпълнението, така че не можете да разчитате преносимо на поведението, което виждате. - person CB Bailey   schedule 11.10.2009