The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

Обобщение опыта Coverity по статистическому анализу миллиардов строк кода

15.02.2010 14:09

Разработчики системы для автоматизированного выявления ошибок Coverity опубликовали статью, в которой обобщили наиболее важные выводы о природе возникновения ошибок в реальных проектах. Приводится пример важности обнаружения трудноуловимых глупых ошибок, вызванных невнимательностью разработчиков, но часто приводящих к серьезным последствиям. Например конструкция "if(getuid() !=0 && geteuid == 0){ErrorF("only root");exit(1);}" вызвала серьезную уязвимость в X-сервере, так как использование "geteuid" вместо "geteuid()" привело к сравнению указателя на функцию, который никогда не равен 0, соответственно условие всегда было ложным.

  1. Главная ссылка к новости (http://cacm.acm.org/magazines/...)
  2. OpenNews: Исследование Coverity показало улучшение качества открытого кода
  3. OpenNews: Найденная уязвимость показала важность постоянного мониторинга вносимого кода
  4. OpenNews: Опубликованы результаты тестирования 2500 открытых проектов
Лицензия: CC BY 3.0
Источник: lwn.net
Короткая ссылка: https://opennet.ru/25423-Coverity
Ключевые слова: Coverity, test, debug
При перепечатке указание ссылки на opennet.ru обязательно


Обсуждение (19) Ajax | 1 уровень | Линейный | +/- | Раскрыть всё | RSS
  • 1.1, Аноним (-), 15:28, 15/02/2010 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    Какой ужас, неужели это

    if(getuid() !=0 && geteuid == 0){}

    написал человек, что он хотел тут проверить?
    интересно, это сама программа нашла эту ошибку или она выдёт подозрительные строчки?

     
     
  • 2.5, аноним (?), 16:19, 15/02/2010 [^] [^^] [^^^] [ответить]  
  • +/
    > написал человек, что он хотел тут проверить?

    А что непонятного?

     
  • 2.8, Zulu (?), 17:47, 15/02/2010 [^] [^^] [^^^] [ответить]  
  • +/
    хотел проверить, не через sudo/suid-бинарник ли мы запустились.
     

  • 1.2, ffsdmad (ok), 15:41, 15/02/2010 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    if(pow(2, 2) !=0 && pow(2, 2) == 0){ printf(не послать ли нам гонца за бутылочкой винца"); }
     
     
  • 2.3, uldus (ok), 15:46, 15/02/2010 [^] [^^] [^^^] [ответить]  
  • +2 +/
    >if(pow(2, 2) !=0 && pow(2, 2) == 0){ printf(не послать ли нам
    >гонца за бутылочкой винца"); }

    getuid не тождественно getEuid

    Должно было быть:
    if(getuid() !=0 && geteuid() == 0){}
    но скобки забыли

     
     
  • 3.11, pavlinux (ok), 22:38, 15/02/2010 [^] [^^] [^^^] [ответить]  
  • +/
    Моск огни забыли.  Надо код прогонять с -Wall -Werror

    # gcc test.c -Wall -Werror
    cc1: warnings being treated as errors
    test.c: В функции ‘main’:
    test.c:8: ошибка: the address of ‘geteuid’ will never be NULL

     
     
  • 4.17, F.Y. (?), 02:50, 16/02/2010 [^] [^^] [^^^] [ответить]  
  • +/
    X с -wall'ом не собираются :) (Почти шутка)
     

  • 1.9, Аноним (-), 18:09, 15/02/2010 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    только я не увидел e ?
     
     
  • 2.19, Аноним (-), 07:40, 16/02/2010 [^] [^^] [^^^] [ответить]  
  • +/
    Нет, не только..
     

  • 1.10, bw (??), 20:56, 15/02/2010 [ответить] [﹢﹢﹢] [ · · · ]  
  • +2 +/
    Больше стоит винить сам язык, а не кодеров. Неявное преобразование типов и т.д. В том же Pascal'е, как бы его сильно не любили, такую ошибку допустить невозможно дважды (указатель не может иметь значения 0 и если мы хотим работать с адресом функции, а не с её результатом, то так и придется говорить компилятору - @).

    ..bw

     
     
  • 2.12, pavlinux (ok), 22:52, 15/02/2010 [^] [^^] [^^^] [ответить]  
  • +/
    > указатель не может иметь значения 0

    Опа! Указатель не имеет значения, он указывает :)

    int main() {

            int var = 0;
            int *p = 0;
            int *pp = 0;

            p = &var;
            pp = p;
            p  = 0;

    return 0;
    }

    Чё страшного-то?

     
  • 2.13, Mna (??), 00:31, 16/02/2010 [^] [^^] [^^^] [ответить]  
  • +/
    Нет, никогда не стоит винить язык вместо самих кодеров.

    В том же Poscacal-е
    1.
    > указатель не может иметь значения 0,

    но может и часто имеет значение nil, как пример:
    if GetUIDPtr() <> nil and GetEUIDPtr = nil then begin end;

    2.
    > то там всегда надо говорить компилятору - @

    а в C нужно вставлять &, не обязательно, правда, но так сделано для удобства.

    Дело в том, что в С работают-таки с указателями, в отличии от Паскаля. Единственный Паскаль в котором можно нормально работать с указателями - это Борландовские паскали, в которых от паскаля один лишь С и остался.

    Потому причина ошибок не в языке, а в конкретных кодерах.
    No silver bullet

     
     
  • 3.14, pavlinux (ok), 01:26, 16/02/2010 [^] [^^] [^^^] [ответить]  
  • +/
    > ...  GetEUIDPtr = nil then begin end;

    "=" или "=="

    Ах да, в паскале присваивание это ":="


     
     
  • 4.18, ram_scan (?), 06:23, 16/02/2010 [^] [^^] [^^^] [ответить]  
  • +/
    В паскале ваша конструкция компилироваться не будет и язык вам ошибку сделать не даст.

    Если это функция без аргументов, то скобки там лишние. Это во первых.

    Во вторых, как утверждал один из ораторов выше, взятие адреса функции выполняется отдельным оператором.

    Поэтому как ни пиши, и сравнивай хоть с нулем хоть с Nil - будет два вызова функции.

    Строгая типизация - рулит.

     
     
  • 5.22, Mna (??), 21:36, 20/02/2010 [^] [^^] [^^^] [ответить]  
  • +/
    >В паскале ваша конструкция компилироваться не будет

    В этом и point: Паскаль - для бумажным программистов. Указателя в жизни не нюхавших.
    Потому и работа с указателями с нем - неудобна.

    и компилироваться не будет, но какой ценой?

    > Это во первых.

    Pascal compiler detected!! :)

    >
    >Во вторых, как утверждал один из ораторов выше, взятие адреса функции выполняется
    >отдельным оператором.

    это то же самое "во-первых". :)

    >Поэтому как ни пиши, и сравнивай хоть с нулем хоть с Nil
    >- будет два вызова функции.

    для сравнения указателей функция не вызывается ни в каком себя уважающем языке :)
    даже в паскале. Вы наверное так и не вышли за ментальные рамки Виртуальной-Паскаль-машины.


    >Строгая типизация - рулит.

    Но только для студентов первого курса.

    Учитывая акселерацию, сейчас - для нулевого..

    В реальных задачах это больше помеха: компилятор никогда не умнее программиста. Программист компилирует свои знания в исходный код. чем высокоуровнее этот код тем всем лучше. а если не так, то пишите на ассемлере...нет, в машинных кодах.

     

  • 1.15, pavlinux (ok), 01:33, 16/02/2010 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    Скажите люди, кто-нибудь, когда-нибудь эту Coverity юзал.

    Я кроме их рекламных достижений ничего и не знаю.

     
     
  • 2.20, Евгений (??), 08:27, 16/02/2010 [^] [^^] [^^^] [ответить]  
  • +/
    Это статический анализатор кода.

    У нас в компании используется: для С и C++ кода. Весьма полезная штука.
    И весьма продвинутая.
    Для маломальски крупных проектов нужно иметь что-то подобное.

    Кстати, простенький вариант статического анализатора: http://cppcheck.sourceforge.net/

     
     
  • 3.21, pavlinux (ok), 01:23, 18/02/2010 [^] [^^] [^^^] [ответить]  
  • +/
    >Это статический анализатор кода.

    Что это таке, я знаю. Но кроме слухов и радостных, слюниипускающих рассказов не слышал :)

    >У нас в компании используется: для С и C++ кода. Весьма полезная штука.
    >И весьма продвинутая.

    Дайте поиграться...
    >Для маломальски крупных проектов нужно иметь что-то подобное.
    >Кстати, простенький вариант статического анализатора: http://cppcheck.sourceforge.net/

    видали, юзали, ...

    Я юзаю связку splint + rats + its4 + flawfinder +  pscan + gibberish + boot + mops + bogosec + boon + ckit + magic + valgrid + smatch :)

    Но так достало их постоянно настраивать ...

     

  • 1.16, lynx (??), 01:35, 16/02/2010 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    это же Pascal, там нет == ;P
     

     Добавить комментарий
    Имя:
    E-Mail:
    Текст:



    Партнёры:
    PostgresPro
    Inferno Solutions
    Hosting by Hoster.ru
    Хостинг:

    Закладки на сайте
    Проследить за страницей
    Created 1996-2024 by Maxim Chirkov
    Добавить, Поддержать, Вебмастеру