LINUX.ORG.RU

Найден 33-летний баг в коде yacc

 , , ,


0

0

Голландский программист Отто Моэрбик случайно нашёл баг в коде функции yyparse(), вскоре после написания собственного варианта malloc для OpenBSD. Николай Штурм первым обнаружил проблему, предположительно связанную с новым malloc, на платформе SPARC64 при попытке компиляции большого проекта на С++ с использованием новой версии malloc от Моэрбика, компилятор иногда завершается с сообщением о внутренней ошибке. После недолгого исследования оказалось, что при определённых условиях (создаваемых новой версией malloc) в функции yyparse происходит обращение к несуществующему элементу массива.

Выпущен соответствующий патч для OpenBSD, решающий данную проблему. Данный баг существует и в старых версиях UNIX вплоть до Sixth Edition UNIX, выпущенной в 1975 году.

>>> Подробности

★★★★★

Проверено: Shaman007 ()
Ответ на: комментарий от Metallic

> Неправильно мыслишь, здесь вообще не сказано про то, что _нельзя это перелицензировать_ ;-)

Смешно пошутил, ага. Цирк уехал, а клоуны остались.

Право изменять условия распространения принадлежит /исключительно/ автору произведения, если он /явно/ не разрешил.

baka-kun ★★★★★
()
Ответ на: комментарий от KUser

> в файле есть строки "BSD Socket API for Windows"

Эти строки ничего не говорят о BSD /лицензии/.

> Если это так, могу ли я его распространять?

Ту часть winsock.dll, которая распространяется под BSD лицензией, и если это не противоречит действующему законодательству — сколько душе угодно.

Остальные части, не являющиеся модифицированным BSDL кодом, а просто вызывающие его функции, — только в соответствии с их лицензией.

baka-kun ★★★★★
()
Ответ на: комментарий от baka-kun

Тогда непонятно где лежит граница между модифицированным кодом и "другими частями"? Если файл представлен одним куском, а исходников нет, то можно считать что весь файл - модифицированный BSD код?

KUser
()
Ответ на: комментарий от KUser

> Тогда непонятно где лежит граница между модифицированным кодом и "другими частями"?

Как это «где»? Ты не в состоянии отличить модифицированную функцию от стороннего кода, который её вызывает?

> можно считать что весь файл - модифицированный BSD код?

Нельзя.

baka-kun ★★★★★
()
Ответ на: комментарий от baka-kun

>Ты не в состоянии отличить модифицированную функцию от стороннего кода, который её вызывает?

В состоянии, если допустим библиотека BSD вызывается из другой программы. А если, как в этом случае, имеем библиотеку портированную на другую платформу, исходников нет, но имена экспортируемых функций те же?

KUser
()
Ответ на: комментарий от baka-kun

Уточню: по внешнему виду можно сказать что только модификация, но точно это можно установить только при наличии исходника. Которого нет

KUser
()
Ответ на: комментарий от se

> 2val-amart > Единственный коментарий в теме, который было интересно прочитать. респект

*bowing*

>> Отто Моэрбик большой молодец! как говорят на андедли, "с ним не поспоришь, он сортирует списки О(1)"

> Маладец, харашо сказал, всему верю но вот про O(1), простите, нет. Ирония? Над ним издевались наверное? ;-)

Это ему так товарищи респект выражают.

>> Но есть еще такой момент - при yym == 0 надо вернуть не мусор, а например 0.

> Не нужно, результат не определен. Ты ведь не используешь в своих проектах значение, возвращаемое функциями типа 'void func()'?

odip прав. в таком случае по правилам нужно возвращать 0. в доке так написано =)

А уж кто там чего использует... Ну, спорный момент, юниксвей гласит, что программисту могло и в страшных снах не сниться, как будут использовать его программу.

val-amart ★★★★★
()
Ответ на: комментарий от val-amart

> А уж кто там чего использует...

Если использовать его по прямому назначению, как генератор парсеров непротиворечивых LR грамматик, то достаточно трудно на эту ошибку напороться.

> в таком случае по правилам нужно возвращать 0. в доке так написано

В какой доке написано? Понимаешь, «большой молодец» Отто сделал очень неприятную вещь: он для грамматического правила с нулевым токеном в правой части нарисовал экшен. Если бы не было экшена, yacc нормально бы всё редуцировал. Но он ввёл действие, не определив возвращаемого значения. Хотя «This rule is assumed to return a value».

У пустого токена /нет/ значения, оно не определено. Если уж вводишь к нему действие, будь добр определить возвращаемое значение. Как собственно и поступали программисты всю жизнь. Как поступает сам yacc, когда разрешает конструкцию вида

A : B { ... } C { ... };

, превращая её в

TEMP: /* empty */ { ... };

A : B TEMP C { ... };

baka-kun ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.