Portál AbcLinuxu, 1. června 2024 16:00

Chybové hlášky překladačů

22.2.2006 21:05 | Přečteno: 1543× | Plané filozofování

Je mi líto, zase to bude o C++ (ale i o Adě:-). Při programování člověk občas udělá chybu. A obvykle ocení její přesnou diagnostiku, neboť to je velice dobrý předpoklad k nápravě.

Některá prostředí poskytují velmi vtipný popis chyby - například překladač Ady GNAT poté, co nalezne neznámý identifikátor v následujícím kódu:

procedure Test is
        procedure Launch_Missile is
        begin
                null;
        end;
begin
        Launch_Misile;
end;

zahlásí toto:

test.adb:7:09: "Launch_Misile" is undefined
test.adb:7:09: possible misspelling of "Launch_Missile"

Tedy navrhne správné řešení. Hodí se to, šetří to nervy a čas. (V jedné konferenci jistý člověk propagoval, že podobné chyby by překladač měl opravovat automaticky. Za pár let by se začala na informatických školách vyučovat "psychologie překladačů" :-)

Na opačném konci spektra je C++. Udělal jsem malý pokus a předhodil překladači následující nesprávný kód.

#include <algorithm>
#include <list>
using namespace std;

int main()
{
        list<int> foo;
        sort(foo.begin(), foo.end());
}
Vypadá to celkem nevinně, ale je to mazaná sémantická chyba. Chybové hlášení vypadá asi takto:

/usr/lib/gcc/i486-linux-gnu/4.0.3/../../../../include/c++/4.0.3/bits/stl_algo.h: In function 'void std::sort(_RandomAccessIterator, _RandomAccessIterator) [with _RandomAccessIterator = std::_List_iterator<int>]': pokus.cpp:8: instantiated from here /usr/lib/gcc/i486-linux-gnu/4.0.3/../../../../include/c++/4.0.3/bits/stl_algo.h:2569: error: no match for 'operator-' in '__last - __first' /usr/lib/gcc/i486-linux-gnu/4.0.3/../../../../include/c++/4.0.3/bits/stl_algo.h: In function 'void std::__final_insertion_sort(_RandomAccessIterator, _RandomAccessIterator) [with _RandomAccessIterator = std::_List_iterator<int>]': /usr/lib/gcc/i486-linux-gnu/4.0.3/../../../../include/c++/4.0.3/bits/stl_algo.h:2570: instantiated from 'void std::sort(_RandomAccessIterator, _RandomAccessIterator) [with _RandomAccessIterator = std::_List_iterator<int>]' pokus.cpp:8: instantiated from here /usr/lib/gcc/i486-linux-gnu/4.0.3/../../../../include/c++/4.0.3/bits/stl_algo.h:2213: error: no match for 'operator-' in '__last - __first' /usr/lib/gcc/i486-linux-gnu/4.0.3/../../../../include/c++/4.0.3/bits/stl_algo.h:2215: error: no match for 'operator+' in '__first + 16' /usr/lib/gcc/i486-linux-gnu/4.0.3/../../../../include/c++/4.0.3/bits/stl_algo.h:2216: error: no match for 'operator+' in '__first + 16' /usr/lib/gcc/i486-linux-gnu/4.0.3/../../../../include/c++/4.0.3/bits/stl_algo.h: In function 'void std::__insertion_sort(_RandomAccessIterator, _RandomAccessIterator) [with _RandomAccessIterator = std::_List_iterator<int>]': /usr/lib/gcc/i486-linux-gnu/4.0.3/../../../../include/c++/4.0.3/bits/stl_algo.h:2219: instantiated from 'void std::__final_insertion_sort(_RandomAccessIterator, _RandomAccessIterator) [with _RandomAccessIterator = std::_List_iterator<int>]' /usr/lib/gcc/i486-linux-gnu/4.0.3/../../../../include/c++/4.0.3/bits/stl_algo.h:2570: instantiated from 'void std::sort(_RandomAccessIterator, _RandomAccessIterator) [with _RandomAccessIterator = std::_List_iterator<int>]' pokus.cpp:8: instantiated from here /usr/lib/gcc/i486-linux-gnu/4.0.3/../../../../include/c++/4.0.3/bits/stl_algo.h:2129: error: no match for 'operator+' in '__first + 1' /usr/lib/gcc/i486-linux-gnu/4.0.3/../../../../include/c++/4.0.3/bits/stl_algo.h:2219: instantiated from 'void std::__final_insertion_sort(_RandomAccessIterator, _RandomAccessIterator) [with _RandomAccessIterator = std::_List_iterator<int>]' /usr/lib/gcc/i486-linux-gnu/4.0.3/../../../../include/c++/4.0.3/bits/stl_algo.h:2570: instantiated from 'void std::sort(_RandomAccessIterator, _RandomAccessIterator) [with _RandomAccessIterator = std::_List_iterator<int>]' pokus.cpp:8: instantiated from here /usr/lib/gcc/i486-linux-gnu/4.0.3/../../../../include/c++/4.0.3/bits/stl_algo.h:2135: error: no match for 'operator+' in '__i + 1'

A v čem je chyba? No algoritmus řazení potřebuje přistupovat k řazeným datům přímo, vyžaduje iterátor třídy RandomAccessIterátor. Jenže kontejner v mém příkladu je zřetězený seznam, takže jeho iterátor podporuje pouze sekvenční procházení.

Jenže to se z takové šílené hlášky člověk (přímo) nedozví. Problém je, že překladač uvažuje v intencích "přenositelného assembleru", kdežto STL jsou tuny abstrakce. A to je propast jako hrom, takže zkoumaná chyba se projeví někde hluboko ve střevech standardní knihovny (neexistence přetíženého operátoru "-").

Uznávám, že mé srovnání je trochu nefér, první chyba je primitivní, druhá rafinovaná. Nicméně do takové Javy můžete napsat, co chcete, a stejně chybová hláška nebude mít dva kilobajty.

       

Hodnocení: 86 %

        špatnédobré        

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

Komentáře

Nástroje: Začni sledovat (2) ?Zašle upozornění na váš email při vložení nového komentáře. , Tisk

Vložit další komentář

22.2.2006 21:19 machr | skóre: 2 | blog: machr
Rozbalit Rozbalit vše Re: Chybové hlášky překladačů
Odpovědět | Sbalit | Link | Blokovat | Admin
C++ RULEZ !!!
(__) (oo) /-------\/ / | || * ||----|| ~~ ~~
22.2.2006 21:35 Jarek Čecho | skóre: 13 | blog: Jarcec_Zone | Koprivnice
Rozbalit Rozbalit vše Hlasky C++ compileru
Odpovědět | Sbalit | Link | Blokovat | Admin
Jo no s tim mam taky vlastni zkusenosti :-(

Resit pak takoveto problemy je na dlouhou dobu, to radeji prislusnou cast smazu a pokusim se ji udelat nejak jinak :-/
22.2.2006 21:38 Sinuhet | skóre: 31
Rozbalit Rozbalit vše Re: Chybové hlášky překladačů
Odpovědět | Sbalit | Link | Blokovat | Admin

Pane paskma, vy si z nas normalne robite prcu. Pro ty, kdo tento vtip zcela nepochopili, male postouchnuti:

$ g++-4.0 -D _GLIBCXX_CONCEPT_CHECKS test.cc

... 57 radek erroru, posledni dva (zaverecny zalomeny a odsazeny taby) ...

test.cc:8:   instantiated from here
/usr/lib/gcc/i486-linux-gnu/4.0.3/../../../../include/c++/4.0.3/bits/boost_concept_check.h:223:
	error: conversion from 'std::bidirectional_iterator_tag' to
	non-scalar type 'std::random_access_iterator_tag' requested
22.2.2006 21:55 paskma | skóre: 13 | blog: Paskmův blog
Rozbalit Rozbalit vše Re: Chybové hlášky překladačů
Hmm, hezký trik. Jeden z důvodů, proč píšu blog jsou takovéhle komentáře.
22.2.2006 21:59 Jarek Čecho | skóre: 13 | blog: Jarcec_Zone | Koprivnice
Rozbalit Rozbalit vše Trik...
No me osobne GCC takovyto vystup neradkuje, takze najit tento dulezity radek v tom zmatku je na dost dlouhou praci...
22.2.2006 22:16 Michal Vyskočil | skóre: 60 | blog: miblog | Praha
Rozbalit Rozbalit vše Re: Chybové hlášky překladačů
Hezká fičurka :-)
When your hammer is C++, everything begins to look like a thumb.
.. avatar 22.2.2006 22:45 .. | skóre: 4 | blog:
Rozbalit Rozbalit vše Re: Chybové hlášky překladačů
pekneee, jeste dalsi figle v tomhle smeru?
22.2.2006 22:02 #Tom
Rozbalit Rozbalit vše Re: Chybové hlášky překladačů
Odpovědět | Sbalit | Link | Blokovat | Admin
To je proto, aby v C++ dělali jenom chytří a všímaví lidé, kteří si umějí kód zkontrolovat i bez překladače. :-)
elviin avatar 23.2.2006 02:50 elviin | skóre: 29 | blog: elviin | Plzeň-Praha
Rozbalit Rozbalit vše Re: Chybové hlášky překladačů
Odpovědět | Sbalit | Link | Blokovat | Admin
Nastroj pro upravu hlasek: stlfilt
elviin avatar 23.2.2006 15:40 elviin | skóre: 29 | blog: elviin | Plzeň-Praha
Rozbalit Rozbalit vše Re: Chybové hlášky překladačů
Zkuste stlfilt: prekladace
Comeau C++
gcc 2.95.x/3.x (incl. DJGPP) (Dev-C++ compatible)
MSVC++ 6/7.x/8.x (incl. "Whidbey" and Dinkum Libraries)
Metrowerks CodeWarrior Pro 7/8
Borland C++ / C++Builder
Intel C++ 7/8
EDG Front End (Generic)
Digital Mars C++
23.2.2006 13:55 jekub | skóre: 9 | blog: noblog
Rozbalit Rozbalit vše Možná hloupý dotaz, ale
Odpovědět | Sbalit | Link | Blokovat | Admin
c++ == gcc?

spojovat chybové hlášení překladače s jazykem ...
23.2.2006 14:58 Kero | skóre: 2
Rozbalit Rozbalit vše Re: Možná hloupý dotaz, ale
Toto je vysledek z MS VS 2005. Myslim, ze je o neco lepsi.

------ Build started: Project: STLerror1, Configuration: Debug Win32 ------
Compiling...
main.cpp
C:\Program Files\Microsoft Visual Studio 8\VC\include\algorithm(2754) : error C2784: 'reverse_iterator<_RanIt>::difference_type std::operator -(const std::reverse_iterator<_RanIt> &,const std::reverse_iterator<_RanIt2> &)' : could not deduce template argument for 'const std::reverse_iterator<_RanIt> &' from 'std::list<_Ty>::_Iterator<_Secure_validation>'
        with
        [
            _Ty=int,
            _Secure_validation=true
        ]
        C:\Program Files\Microsoft Visual Studio 8\VC\include\xutility(1818) : see declaration of 'std::operator -'
        .\main.cpp(8) : see reference to function template instantiation 'void std::sort<std::list<_Ty>::_Iterator<_Secure_validation>>(_RanIt,_RanIt)' being compiled
        with
        [
            _Ty=int,
            _Secure_validation=true,
            _RanIt=std::list<int>::_Iterator<true>
        ]
C:\Program Files\Microsoft Visual Studio 8\VC\include\algorithm(2754) : error C2784: 'reverse_iterator<_RanIt>::difference_type std::operator -(const std::reverse_iterator<_RanIt> &,const std::reverse_iterator<_RanIt2> &)' : could not deduce template argument for 'const std::reverse_iterator<_RanIt> &' from 'std::list<_Ty>::_Iterator<_Secure_validation>'
        with
        [
            _Ty=int,
            _Secure_validation=true
        ]
        C:\Program Files\Microsoft Visual Studio 8\VC\include\xutility(1818) : see declaration of 'std::operator -'
C:\Program Files\Microsoft Visual Studio 8\VC\include\algorithm(2754) : error C2784: 'reverse_iterator<_RanIt>::difference_type std::operator -(const std::reverse_iterator<_RanIt> &,const std::reverse_iterator<_RanIt2> &)' : could not deduce template argument for 'const std::reverse_iterator<_RanIt> &' from 'std::list<_Ty>::_Iterator<_Secure_validation>'
        with
        [
            _Ty=int,
            _Secure_validation=true
        ]
        C:\Program Files\Microsoft Visual Studio 8\VC\include\xutility(1818) : see declaration of 'std::operator -'
C:\Program Files\Microsoft Visual Studio 8\VC\include\algorithm(2754) : error C2784: 'reverse_iterator<_RanIt>::difference_type std::operator -(const std::reverse_iterator<_RanIt> &,const std::reverse_iterator<_RanIt2> &)' : could not deduce template argument for 'const std::reverse_iterator<_RanIt> &' from 'std::list<_Ty>::_Iterator<_Secure_validation>'
        with
        [
            _Ty=int,
            _Secure_validation=true
        ]
        C:\Program Files\Microsoft Visual Studio 8\VC\include\xutility(1818) : see declaration of 'std::operator -'
C:\Program Files\Microsoft Visual Studio 8\VC\include\algorithm(2754) : error C2676: binary '-' : 'std::list<_Ty>::_Iterator<_Secure_validation>' does not define this operator or a conversion to a type acceptable to the predefined operator
        with
        [
            _Ty=int,
            _Secure_validation=true
        ]
C:\Program Files\Microsoft Visual Studio 8\VC\include\algorithm(2754) : error C2780: 'void std::_Sort(_RanIt,_RanIt,_Diff,_Pr)' : expects 4 arguments - 3 provided
        C:\Program Files\Microsoft Visual Studio 8\VC\include\algorithm(2873) : see declaration of 'std::_Sort'
Build log was saved at "file://c:\Documents and Settings\student\My Documents\Visual Studio 2005\Projects\STLerror1\STLerror1\Debug\BuildLog.htm"
STLerror1 - 6 error(s), 0 warning(s)
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========

Jsem odpůrcem GPL, ale ne odpůrce svobodného softwaru. Jen software pod MIT licencí je opravdu svobodný.
23.2.2006 15:21 Aleš Kapica | skóre: 51 | blog: kenyho_stesky | Ostrava
Rozbalit Rozbalit vše Re: Možná hloupý dotaz, ale
Jasně.. až na to, že mi okno uteklo až někam za Ural...
23.2.2006 22:21 Kero | skóre: 2
Rozbalit Rozbalit vše Re: Možná hloupý dotaz, ale
promin, pouzil jsem nejaky awkckovy skript text2html a pri nahledu jsem si toho nevsiml.
Jsem odpůrcem GPL, ale ne odpůrce svobodného softwaru. Jen software pod MIT licencí je opravdu svobodný.
23.2.2006 16:04 paskma | skóre: 13 | blog: Paskmův blog
Rozbalit Rozbalit vše Re: Možná hloupý dotaz, ale
No o moc lepší to tedy není. Překladač se prostě shání po operátoru "-".
23.2.2006 17:50 #Tom
Rozbalit Rozbalit vše Taky nic moc
V tom výpisu je těch keců docela hodně a taky z toho nic moc nevyplývá. Z monitoru to dost trčí, 356 znaků na řádek je hodně. A v konzoli 80x24 je to úplně nejlepší. :-)

Založit nové vláknoNahoru

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.