bmstu-iu9 / refal-5-lambda

Компилятор Рефала-5λ
https://bmstu-iu9.github.io/refal-5-lambda
Other
78 stars 35 forks source link

Уточнить поведение предупреждений: приблизить их к GCC #281

Closed Mazdaywik closed 4 years ago

Mazdaywik commented 4 years ago

Поведение GCC, которое мы рассматриваем как образец:

D:\Mazdaywik\Documents\Refal-5-lambda\build>gcc -c warnings.c -Wall
warnings.c: In function 'f':
warnings.c:2:3: warning: overflow in implicit constant conversion [-Woverflow]
   char y = 65536;
   ^

D:\Mazdaywik\Documents\Refal-5-lambda\build>gcc -c warnings.c -Wall -Werror
warnings.c: In function 'f':
warnings.c:2:3: error: overflow in implicit constant conversion [-Werror=overflow]
   char y = 65536;
   ^
cc1.exe: all warnings being treated as errors

D:\Mazdaywik\Documents\Refal-5-lambda\build>gcc -c warnings.c -Wall -Werror=overflow
warnings.c: In function 'f':
warnings.c:2:3: error: overflow in implicit constant conversion [-Werror=overflow]
   char y = 65536;
   ^
cc1.exe: some warnings being treated as errors

D:\Mazdaywik\Documents\Refal-5-lambda\build>gcc -c warnings.c -Wall -Werror -Wno-overflow

D:\Mazdaywik\Documents\Refal-5-lambda\build>
warnings.c ```C++ int f(int x) { char y = 65536; return x + y; } ```

Нужно приблизить поведение, реализованное в #273, к поведению GCC.

@nexterot, обращаю внимание — задача назначена мне и она вне вехи study spring 2020.

nexterot commented 4 years ago

Если была опция -Werror в каком бы то ни было виде, выдаётся об этом дополнительное сообщение *** warnings being treated as errors.

Судя по поведению GCC, данное сообщение выводится только если указанное предупреждение-ошибка было обнаружено в коде:

root@DESKTOP-2ANIPDQ:~/test# gcc main.c  -o main
main.c: In function ‘main’:
main.c:2:12: warning: overflow in implicit constant conversion [-Woverflow]
 char kek = 2000000;
            ^~~~~~~

root@DESKTOP-2ANIPDQ:~/test# gcc main.c -Werror=unused-variable -o main
main.c: In function ‘main’:
main.c:2:12: warning: overflow in implicit constant conversion [-Woverflow]
 char kek = 2000000;
            ^~~~~~~
main.c:2:6: error: unused variable ‘kek’ [-Werror=unused-variable]
 char kek = 2000000;
      ^~~
cc1: some warnings being treated as errors

root@DESKTOP-2ANIPDQ:~/test# gcc main.c -Werror=comment -o main
main.c: In function ‘main’:
main.c:2:12: warning: overflow in implicit constant conversion [-Woverflow]
 char kek = 2000000;
            ^~~~~~~
nexterot commented 4 years ago

GCC также может принимать опцию -Wno-error и all в качестве параметра (т.е. -Wno-error=all)

root@DESKTOP-2ANIPDQ:~/test# gcc main.c -Wall -o main
main.c: In function ‘main’:
main.c:2:12: warning: overflow in implicit constant conversion [-Woverflow]
 char kek = 2000000;
            ^~~~~~~
main.c:2:6: warning: unused variable ‘kek’ [-Wunused-variable]
 char kek = 2000000;
      ^~~

root@DESKTOP-2ANIPDQ:~/test# gcc main.c -Werror -o main
main.c: In function ‘main’:
main.c:2:12: error: overflow in implicit constant conversion [-Werror=overflow]
 char kek = 2000000;
            ^~~~~~~
cc1: all warnings being treated as errors

root@DESKTOP-2ANIPDQ:~/test# gcc main.c -Werror -Wno-error=overflow -o main
main.c: In function ‘main’:
main.c:2:12: warning: overflow in implicit constant conversion [-Woverflow]
 char kek = 2000000;
            ^~~~~~~

root@DESKTOP-2ANIPDQ:~/test# gcc main.c -Werror -Wno-error=all -o main
main.c: In function ‘main’:
main.c:2:12: error: overflow in implicit constant conversion [-Werror=overflow]
 char kek = 2000000;
            ^~~~~~~
cc1: all warnings being treated as errors

имеющую, как кажется, не совсем очевидное поведение:

root@DESKTOP-2ANIPDQ:~/test# gcc main.c -Werror=all -Wno-error=all -o main
main.c: In function ‘main’:
main.c:2:12: warning: overflow in implicit constant conversion [-Woverflow]
 char kek = 2000000;
            ^~~~~~~
main.c:2:6: error: unused variable ‘kek’ [-Werror=unused-variable]
 char kek = 2000000;
      ^~~
cc1: some warnings being treated as errors

Вопрос в том, насколько близко надо приблизиться к логике GCC?

Mazdaywik commented 4 years ago

Да, последний листинг совсем не очевиден 😀.

Про то, что есть симметрия -Werror и -Wno-error, не знал. Но с другой стороны логично — удовлетворяет принципу наименьшего удивления (программа должна работать так, чтобы вызывать наименьшее удивление у пользователя).

Буду ли я делать у себя -Wno-error, не знаю. По настроению.

nexterot commented 4 years ago

Все равно было делать нечего :)

0a88ed92 1) Конструкция -W[no-]error[=...]. Параметр all не добавлял; 2) Для предупреждений в квадратных скобках указываются их имена в виде опций командной строки; 3) Выдаются сообщения вида ***.ref: some/all warnings being treated as errors; 4) Если был указано -Werror=<флаг> и обнаружено предупреждение этого типа, то при печати (как в GCC) будет выведено ERROR, а не WARNING ; 5) Конструкции вида -Werror=<флаг> неявно включают -W<флаг> (тоже как в GCC); наоборот, -Wno-error=<флаг> не исполняет -Wno-<флаг>.

Пример:

D:\refal-5-lambda\build>..\bin\rlc.bat -Wall -Werror=nul-in-compound hello.ref
*Compiling hello.ref:
hello.ref:5:1: WARNING: Function FINAL should not be declared $ENTRY [-Winit-final-entry]
hello.ref:10:14: ERROR: Zero byte in compound symbol [-Werror=nul-in-compound]
hello.ref: some warnings being treated as errors
Mazdaywik commented 4 years ago

Комментарии (преимущественно по стилю) я написал на странице коммита: https://github.com/bmstu-iu9/refal-5-lambda/commit/0a88ed9292f34165d69cc38b823f6b531566c6d7.

Mazdaywik commented 4 years ago
StrFromPos {
  NoPos = '  ';
  (FileLine s.LineNumber e.FileName) = e.FileName ':' <Symb s.LineNumber>;
  (FileRowCol (s.Row s.Col) e.FileName) = e.FileName ':' <Symb s.Row> ':' <Symb s.Col>;
}
nexterot commented 4 years ago

Исправил 48c7bf90

Mazdaywik commented 4 years ago

Сплющивайте оба коммита, добавляйте к ним номер #281 и делайте pull request.