Сделать gcc-предупреждение для явных преобразований [duplicate]

С ES5 + (любой просматриваемый в настоящее время - 2017) вы должны иметь возможность делать

[].forEach.call(document.getElementsByClassName('answer'), function(el) {
    el.style.color= 'red';
});

6
задан Chris 25 April 2012 в 16:36
поделиться

5 ответов

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

. Вместо этого, в зависимости от того, насколько огромный ваш источник, вы можете уметь уйти с:

grep '\(double|float\) ' *

, чтобы дать вам все двойные или плавающие переменные. Так как c не является обычным языком, нет тривиального (с инструментами оболочки) для его синтаксического анализа в список двойных или плавающих переменных, но если ваш источник достаточно мал, сделать это вручную легко.

grep '([^()]*)[ ()]*\(your list of variable names\)' *

Оттуда вы увидите много ваших приемов.

2
ответ дан Dave 22 August 2018 в 20:06
поделиться

Ну, я думаю, что такого варианта нет. В конце концов, компилятор выдает предупреждение, чтобы предупредить вас о том, что вы, возможно, сделали непреднамеренно. Явное приведение, однако, в основном способ сказать вашему компилятору «заткнуться, я знаю, что я делаю».

0
ответ дан cli_hlt 22 August 2018 в 20:06
поделиться
  • 1
    Это не плавать или удваивается, что я волнуюсь, это от поплавка и удваивает что-нибудь еще. Я создал список для всех трансляций, но мне нужно извлечь имена переменных из этого списка, которые являются только плавающими или двойными, что мне очень сложно сделать. – Chris 25 April 2012 в 16:49
  • 2
    Какой тип приведения здесь вообще проблематичен? Если они проблематичны, почему они попали в код на первое место? – cli_hlt 25 April 2012 в 16:53
  • 3
    @cli_hlt: Знаете, существует плохой код, который нужно исправлять до лучших :) – Niklas B. 25 April 2012 в 17:04

Хотя компиляторы, которых я знаю, не имеют для этого вариантов, FlexELint от Gimpel может делать то, что вы хотите:

$ cat tst.c
int main (void)
{
    int i = 0, j = 0;
    float f = 0.0;
    double d = 0.0;

    i = (int) f;
    j = (int) d;
    d = (double) f;
    f = (float) d;
    i = (int)j;
    j = (unsigned) i;
    return (int) j;
}

$ flexelint -w1 +e922 tst.c
FlexeLint for C/C++ (Unix) Vers. 9.00j, Copyright Gimpel Software 1985-2012

--- Module:   tst.c (C)
               _
    i = (int) f;
tst.c  7  Note 922: cast from float to int
               _
    j = (int) d;
tst.c  8  Note 922: cast from double to int
                  _
    d = (double) f;
tst.c  9  Note 922: cast from float to double
                 _
    f = (float) d;
tst.c  10  Note 922: cast from double to float

shell returned 4
1
ответ дан Jens 22 August 2018 в 20:06
поделиться

-Wconversion предупреждают о неявных преобразованиях, которые могут изменить значение (double являются большими типами), а -Wno-sign-conversion отключить предупреждения о конверсиях между целыми числами без подписей и без знака (поэтому было бы меньше ненужных предупреждений). Else Я не вижу стандартной альтернативы ...

В худшем случае вы можете искать эти ключевые слова непосредственно в своих исходных файлах ...

2
ответ дан md5 22 August 2018 в 20:06
поделиться
  • 1
    Из того, что я понимаю, явные преобразования не будут пойманы путем -Wconversion, на самом деле это способ избавиться от предупреждений. Я сделал пару тестов и нашел, что это правда, поэтому мне нужно найти другой способ сделать это. – Chris 25 April 2012 в 16:31
  • 2
    К несчастью, они показаны (по крайней мере, когда я пробовал пару месяцев назад). Я включил -Wconversion для перехвата конверсий accidential , а количество шумов, генерируемых из явных (и предполагаемых) преобразований, было невыносимым. – Damon 25 April 2012 в 17:10

Если ваш C-код также может быть скомпилирован в режиме C ++, вы можете использовать флаг предупреждения g ++ -Wold-style-cast, чтобы вызвать предупреждение для всех таких приведений.

Вы можете определить, есть ли у Клана какие-либо предупреждения, которые будут триггер для конкретного шаблона кодирования с помощью его переключателя -Weverything (но обратите внимание, что это не полезно практически для любой другой цели - clang имеет предупреждения по умолчанию, которые запускаются на различных формах законного кода). Однако в этом случае у clang нет никаких предупреждений, вызывающих такие отбрасывания.

7
ответ дан Richard Smith 22 August 2018 в 20:06
поделиться
Другие вопросы по тегам:

Похожие вопросы: