Подтвердить что ты не робот

Как определить, какие функции С++ 11 используются в моем исходном коде

Скажем, я написал эту программу на С++ (которая практически ничего не делает)

#include <cstdlib>

int main(int argc, char *argv[]) {
  enum class Color { Red, Orange, Yellow, Green, Blue, Violet };
  constexpr float a = 3.1415f;
  auto b = a;
  return EXIT_SUCCESS;
}

Есть ли способ определить, какие функции С++ 11 используются в моей программе? Может быть, какая-то другая программа, которая могла бы извлечь эту информацию из моего исходного кода? Такая программа может выводить список функций:

$ cat main.cc | some-clever-software
N2347
N1984
N2235

(В качестве альтернативы он может выводить URL: s http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2006/n1984.pdf)

Если бы у меня был такой список, было бы проще написать CMakeLists.txt который использует команду CMake target_compile_features(), например, этот

cmake_minimum_required(VERSION 3.1.0 FATAL_ERROR)
project(foobar CXX)
add_executable(foobar main.cc)                                                                                                                                                                                                                                                     
set(needed_features
    cxx_strong_enums
    cxx_constexpr
    cxx_auto_type)
target_compile_features(foobar PRIVATE ${needed_features})

Возможности С++ 11, которые позволяют выбрать CMake, перечислены в переменной CMake CMAKE_CXX_KNOWN_FEATURES. Я знаю, что команда CMake target_compile_features() еще не была выпущена в стабильной версии CMake. В настоящее время он живет в отрасли развития, поэтому в будущем он может измениться. Но тем не менее мне интересно, можно ли обнаружить, какие функции С++ 11 используются в некоторых исходных кодах С++.

Update:

Компиляция без опции -std = С++ 11 компилятора была предложена в комментарии:

Сначала компиляция с помощью g++

$ g++ --version
g++ (Ubuntu/Linaro 4.8.1-10ubuntu9) 4.8.1
Copyright (C) 2013 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

$ g++ main.cc
main.cc: In function ‘int main(int, char**)’:
main.cc:4:3: warning: scoped enums only available with -std=c++11 or -std=gnu++11 [enabled by default]
   enum class Color { Red, Orange, Yellow, Green, Blue, Violet };
   ^
main.cc:5:3: error: ‘constexpr’ was not declared in this scope
   constexpr float a = 3.1415f;
   ^
main.cc:5:13: error: expected ‘;’ before ‘float’
   constexpr float a = 3.1415f;
             ^
main.cc:6:8: error: ‘b’ does not name a type
   auto b = a;
        ^

а затем компиляция с помощью clang

$ clang --version
Debian clang version 3.2-7ubuntu1 (tags/RELEASE_32/final) (based on LLVM 3.2)
Target: x86_64-pc-linux-gnu
Thread model: posix
$ clang main.cc
main.cc:4:8: error: expected identifier or '{'
  enum class Color { Red, Orange, Yellow, Green, Blue, Violet };
       ^
main.cc:4:3: warning: declaration does not declare anything [-Wmissing-declarations]
  enum class Color { Red, Orange, Yellow, Green, Blue, Violet };
  ^~~~
main.cc:5:3: error: unknown type name 'constexpr'
  constexpr float a = 3.1415f;
  ^
main.cc:5:13: error: expected unqualified-id
  constexpr float a = 3.1415f;
            ^
main.cc:6:3: warning: 'auto' type specifier is a C++11 extension [-Wc++11-extensions]
  auto b = a;
  ^
main.cc:6:12: error: use of undeclared identifier 'a'
  auto b = a;
           ^
2 warnings and 4 errors generated.
$

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

N2235

вместо

error: 'constexpr не был объявлен в этой области

4b9b3361

Ответ 1

Как уже говорилось, это статический анализ исходного кода. С помощью некоторого простого grep вы можете определить некоторые функции С++ 11, такие как контейнеры STL 11 STL, noexcept, использование семантики перемещения, авто...

Для более тонкого анализа я бы рекомендовал использовать clang API для анализа исходного кода. Вы можете легко проверить, удалена ли функция (и узнать, какая из них!), Constexpr... С этим вы можете делать все, что захотите (создать отчет, написать файл CMake...)

Во всех случаях я не думаю, что есть инструмент "все-в-одном", и вам придется писать некоторые части самостоятельно.

Ответ 2

То, что вы описываете, - это анализ статического кода. Канонический инструмент, конечно же, пух, но все пошло. В Википедии перечислены 23 инструментария для C/С++. http://en.wikipedia.org/wiki/List_of_tools_for_static_code_analysis

К сожалению, ни один из них не указывает на соответствие определенным уровням С++ как функции. Однако многие из них основаны на правилах и позволяют легко добавлять свои собственные правила. Примеры, которые вы дали, хорошо соответствуют возможностям многих из этих инструментов.

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

Ответ 3

Попробуйте использовать Clang с -std=c++11 -Wc++98-compat и проанализируйте вывод ошибки. (У Clang также есть способ генерировать более удобную для машиной диагностику.) Это должно быть довольно полным, хотя, вероятно, не 100%, и он определенно не найдет возможности библиотеки С++ 11, которые вы используете.