Я начал изучать C ++ с большого учебника, доступного на https://learnxinyminutes.com/docs/c++/ и хотел бы проанализировать в Frama-C простейший пример, который показывает ссылки:
using namespace std;
#include <iostream>
#include <string>
int main() {
string foo = "I am foo";
string bar = "I am bar";
string& fooRef = foo; // This creates a reference to foo.
fooRef += ". Hi!"; // Modifies foo through the reference
cout << fooRef; // Prints "I am foo. Hi!"
// Doesn't reassign "fooRef". This is the same as "foo = bar", and
// foo == "I am bar"// after this line.
cout << &fooRef << endl; //Prints the address of foo
fooRef = bar;
cout << &fooRef << endl; //Still prints the address of foo
cout << fooRef; // Prints "I am bar"
//The address of fooRef remains the same, i.e. it is still referring to foo.
return 0;
}
Я скомпилировал и установил плагин Frama-C C ++ под названием «Frama-Clang».
Теперь, когда я запускаю frama-c, я получаю предупреждения и ошибки в выводе:
$ frama-c refs.cc
[kernel] Parsing FRAMAC_SHARE/libc/__fc_builtin_for_normalization.i (no preprocessing)
[kernel] Parsing refs.cc (external front-end)
refs.cc:13:17: warning: using directive refers to implicitly-defined namespace 'std'
using namespace std;
^
In file included from refs.cc:14:
In file included from /usr/share/frama-c/frama-clang/libc++/iostream:29:
/usr/share/frama-c/frama-clang/libc++/ostream:31:40: error: implicit instantiation of undefined template 'std::basic_ios<char, std::char_traits<char> >'
class basic_ostream : virtual public basic_ios<charT,traits> {
^
refs.cc:23:7: note: in instantiation of template class 'std::basic_ostream<char, std::char_traits<char> >' requested here
cout << fooRef; // Prints "I am foo. Hi!"^
/usr/share/frama-c/frama-clang/libc++/iosfwd:37:68: note: template is declared here
template <class charT, class traits = char_traits<charT> > class basic_ios;
^
code generation aborted due to one compilation error
[kernel] user error: Failed to parse C++ file. See Clang messages for more information
[kernel] user error: stopping on file "refs.cc" that has errors.
[kernel] Frama-C aborted: invalid user input.
Что случилось?
(Frama-C устанавливается из репозитория тестирования Debian в версии 20170501 + фосфор + dfsg-2)
Прежде всего, я хотел бы указать на Страница Frama-Clang:
Frama-Clang в настоящее время находится на ранней стадии разработки. Это, как известно, неполное и идет без какой-либо гарантии без ошибок.
Таким образом, если вы еще не знакомы с C ++, я бы любезно предложил начать с Frama-Clang довольно сложно.
Тем не менее, проблема заключается в том, что, как упоминалось в комментариях, поддержка STL в Frama-Clang минимальна (в частности, выглядит невинно iostream
это не самый простой кусок кода для обработки, когда дело доходит до шаблонов).
Возможно, вам повезет больше, используя frama-c -cxx-nostdinc refs.cc
, которая будет использовать стандартную библиотеку вашей системы вместо библиотеки Frama-Clang: это по крайней мере позволит clang
проверь свой код. Однако нет абсолютно никакой гарантии, что сама Frama-Clang сможет понять все конструкции, предоставляемые этой библиотекой.
Других решений пока нет …