Nano Hash - криптовалюты, майнинг, программирование

Избегайте g ++ -Wuninitialized, вызванного библиотекой

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

#include<iostream>

// Begin Library function
inline int foo() {
    int y;
    if( /*something that will always be true*/ ) y = 42;
    return y;
}
// end Library function

void bar(int x) {
    std::cout << x;
}

int main() {
    int x;
    x = foo();
    bar(x);
    return 0;
}
g++
24.10.2019

  • Вы можете изменить foo? Или проблема в том, что после встраивания в main появляется предупреждение? (Если условие всегда верно, зачем вообще его проверять?) 24.10.2019
  • Я не могу изменить foo (), так как он есть в библиотеке. foo () объявлен встроенным. Извините, что комментарий в коде вводит в заблуждение. Условие не всегда верно, но в библиотеке, где я наблюдаю эту проблему, путь, по которому y не задан, никогда не выполняется. 24.10.2019

Ответы:


1

Насколько сложно это состояние? Во многих случаях это поможет подавить такие предупреждения:

if (! (/*something that will always be true*/))
  __builtin_unreachable();
x = foo();

Или, если вы строите без -DNDEBUG:

assert(/*something that will always be true*/);
x = foo();

Таким образом, когда foo встроено в main, GCC поймет, что условие никогда не может быть истинным, и не предупредит о неинициализированном значении.

24.10.2019
  • К сожалению, условие, которое разветвляется на путь, который оставляет значение y неустановленным, использует защищенные члены, поэтому я не могу получить доступ к этим переменным извне библиотеки. 24.10.2019
  • Чтобы сделать это более конкретным - здесь - это библиотека, а функция - это функция read(). Проблема заключается в пути, по которому переменная tmp не задана до того, как read() вернет tmp. Но этот путь никогда не должен выполняться. 24.10.2019
  • Я думаю, вам также нужно предоставить свой исходный код. Я бы не исключил, что где-то есть настоящая ошибка. 24.10.2019
  • В порядке. Я был склонен думать, что это ошибка, но заметил, что получаю это предупреждение с g ++ 4.9.2, но не с g ++ 6.2.1. 25.10.2019

  • 2

    Ошибка, которую я получаю, похоже, как-то связана с тем фактом, что foo () объявлен inline, потому что я нашел один способ обойти предупреждение, используя следующий подход: ссылка

    int main() {
      int x;
      volatile bool b{true};
      if(b) x = foo();
      else x = foo();
      bar(x);
      return 0;
    }
    
    24.10.2019
    Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

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

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

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

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..