WedX - журнал о программировании и компьютерных науках

Что такое неопределенное поведение в C?

Что такое неопределенное поведение в C?

Я использую компилятор GCC. В некоторых случаях я получаю правильное значение, хотя вывод программы должен был быть неопределенным. Я запускал эти программы несколько раз. Но результат был постоянным. А для некоторых других программ результат был неопределенным. Итак, в каких случаях я должен считать, что поведение программы действительно не определено? Есть ли какие-то ПРАВИЛА для этого?

26.09.2013

Ответы:


1

Определение неопределенного поведения:

C11 (ИСО/МЭК 9899:201x) §3.4.3

1 неопределенное поведение

поведение при использовании непереносимой или ошибочной программной конструкции или ошибочных данных, для которых настоящий стандарт не устанавливает требований

2 ПРИМЕЧАНИЕ Возможное неопределенное поведение варьируется от полного игнорирования ситуации с непредсказуемыми результатами до поведения во время трансляции или выполнения программы документированным образом, характерным для среды (с выдачей или без выдачи диагностического сообщения), до прекращения трансляции или выполнения (с выдача диагностического сообщения).

3 ПРИМЕР Примером неопределенного поведения является поведение при целочисленном переполнении.

Кроме того, в разделе C11 §J.2 Неопределенное поведение есть список неопределенного поведения.

26.09.2013

2

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

Пример:

i = ++i;

Для получения дополнительной информации вы можете прочитать это.

26.09.2013
  • Вопрос помечен тегом C, а в C i++ = ++i; является ужасным примером UB, потому что это не неопределенное поведение, а синтаксическая ошибка. 26.09.2013
  • Ой извини плохо - отредактировано. Спасибо @PascalCuoq 26.09.2013

  • 3

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

    26.09.2013

    4

    Я думаю, что простыми словами, если поведение инструкции не гарантируется для всех компиляторов или всех ситуаций, вы можете сказать, что это неопределенное поведение.

    26.09.2013
  • Нет, то, что вы описываете, может быть неопределенным поведением или поведением, определяемым реализацией. 26.09.2013

  • 5

    Это можно проиллюстрировать на примере,

    #include "stdio.h"
    
    
    int *ptr;
    
    
    
    void func2()
    {
      int k = 300;
    
    }
    
    void func1()
    {
      int t = 100;
    
      ptr = &t;
    }
    
    int main(int argc, char *argv)
    {
    
    
      func1();
    
       printf("The value of t=%d\r\n",*ptr);
    
      func2();
    
    
       printf("The value of t=%d\r\n",*ptr);
    
    }
    
    On my machine, I got the following.
    
    joshis1@(none) temp]$ ./ud.out 
    The value of t=100
    The value of t=300
    

    Это говорит о том, что значение t не было гарантировано. Как только область действия t была исчерпана, пространство стека было выделено для k. Таким образом, ptr обращался к одному и тому же адресу — ячейке памяти. Но с переменной областью действия было покончено. Вы получите согласованный результат, если не вызовете func2(); Таким образом, компилятор не гарантирует результат -> Это называется поведением undefined.

    26.09.2013
  • Отлично!!!Это действительно хороший пример...Очень полезно...Спасибо 26.09.2013
  • Новые материалы

    Как создать диаграмму градиентной кисти с помощью D3.js
    Резюме: Из этого туториала Вы узнаете, как добавить градиентную кисть к диаграмме с областями в D3.js. Мы добавим градиент к значениям SVG и применим градиент в качестве заливки к диаграмме с..

    Я хотел выучить язык программирования MVC4, но не мог выучить его раньше, потому что это выглядит сложно…
    Просто начните и учитесь самостоятельно Я хотел выучить язык программирования MVC4, но не мог выучить его раньше, потому что он кажется мне сложным, и я бросил его. Это в основном инструмент..

    Лицензии с открытым исходным кодом: руководство для разработчиков и создателей
    В динамичном мире разработки программного обеспечения открытый исходный код стал мощной парадигмой, способствующей сотрудничеству, инновациям и прогрессу, движимому сообществом. В основе..

    Объяснение документов 02: BERT
    BERT представил двухступенчатую структуру обучения: предварительное обучение и тонкая настройка. Во время предварительного обучения модель обучается на неразмеченных данных с помощью..

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

    Работа с цепями Маркова, часть 4 (Машинное обучение)
    Нелинейные цепи Маркова с агрегатором и их приложения (arXiv) Автор : Бар Лайт Аннотация: Изучаются свойства подкласса случайных процессов, называемых дискретными нелинейными цепями Маркова..

    Crazy Laravel Livewire упростил мне создание электронной коммерции (панель администратора и API) [Часть 3]
    Как вы сегодня, ребята? В этой части мы создадим CRUD для данных о продукте. Думаю, в этой части я не буду слишком много делиться теорией, но чаще буду делиться своим кодом. Потому что..


    Для любых предложений по сайту: [email protected]