I like the verbose messages from gcc
static analyzer:
<source>: In function 'int main()':
<source>:79:18: warning: use of uninitialized value 'discount' [CWE-457] [-Wanalyzer-use-of-uninitialized-value]
79 | totalSavings = pricePerDisc * quantity * discount;
| ~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
'int main()': events 1-4
|
| 4 | int main()
| | ^~~~
| | |
| | (1) entry to 'main'
|......
| 21 | double discount;
| | ~~~~~~~~
| | |
| | (2) region created on stack here
| | (3) capacity: 8 bytes
| 22 | string discType;
| 23 | string disc1 = "Ultimate Disc";
| | ~~~~~~~~~~~~~~~
| | |
| | (4) calling 'std::__cxx11::basic_string<char>::basic_string<>' from 'main'
|
+--> 'std::__cxx11::basic_string<_CharT, _Traits, _Alloc>::basic_string(const _CharT*, const _Alloc&) [with <template-parameter-2-1> = std::allocator<char>; _CharT = char; _Traits = std::char_traits<char>; _Alloc = std::allocator<char>]': events 5-8
|
|/opt/compiler-explorer/gcc-trunk-20220913/include/c++/13.0.0/bits/basic_string.h:634:7:
| 634 | basic_string(const _CharT* __s, const _Alloc& __a = _Alloc())
| | ^~~~~~~~~~~~
| | |
| | (5) entry to 'std::__cxx11::basic_string<char>::basic_string<>'
|......
| 638 | if (__s == 0)
| | ~~
| | |
| | (6) following 'false' branch (when '__s' is non-NULL)...
|......
| 641 | const _CharT* __end = __s + traits_type::length(__s);
| | ~~~~~~~~~~~~~~~~~~~~~~~~
| | |
| | (7) ...to here
| | (8) calling 'std::char_traits<char>::length' from 'std::__cxx11::basic_string<char>::basic_string<>'
|
+--> 'static constexpr std::size_t std::char_traits<char>::length(const char_type*)': events 9-11
|
|/opt/compiler-explorer/gcc-trunk-20220913/include/c++/13.0.0/bits/char_traits.h:383:7:
| 383 | length(const char_type* __s)
| | ^~~~~~
| | |
| | (9) entry to 'std::char_traits<char>::length'
|......
| 386 | if (std::__is_constant_evaluated())
| | ~~
| | |
| | (10) following 'false' branch...
|......
| 389 | return __builtin_strlen(__s);
| | ~~~~~~~~~~~~~~~~~~~~~
| | |
| | (11) ...to here
|
<------+
|
'std::__cxx11::basic_string<_CharT, _Traits, _Alloc>::basic_string(const _CharT*, const _Alloc&) [with <template-parameter-2-1> = std::allocator<char>; _CharT = char; _Traits = std::char_traits<char>; _Alloc = std::allocator<char>]': events 12-13
|
|/opt/compiler-explorer/gcc-trunk-20220913/include/c++/13.0.0/bits/basic_string.h:641:56:
| 641 | const _CharT* __end = __s + traits_type::length(__s);
| | ~~~~~~~~~~~~~~~~~~~^~~~~
| | |
| | (12) returning to 'std::__cxx11::basic_string<char>::basic_string<>' from 'std::char_traits<char>::length'
| 642 | _M_construct(__s, __end, forward_iterator_tag());
| | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
| | |
| | (13) calling 'std::__cxx11::basic_string<char>::_M_construct<const char*>' from 'std::__cxx11::basic_string<char>::basic_string<>'
|
+--> 'void std::__cxx11::basic_string<_CharT, _Traits, _Alloc>::_M_construct(_InIterator, _InIterator, std::forward_iterator_tag) [with _FwdIterator = const char*; _CharT = char; _Traits = std::char_traits<char>; _Alloc = std::allocator<char>]': events 14-15
|
|/opt/compiler-explorer/gcc-trunk-20220913/include/c++/13.0.0/bits/basic_string.tcc:217:7:
| 217 | basic_string<_CharT, _Traits, _Alloc>::
| | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
| | |
| | (14) entry to 'std::__cxx11::basic_string<char>::_M_construct<const char*>'
|......
| 248 | }
| | ~
| | |
| | (15) calling 'std::__cxx11::basic_string<char>::_M_construct<const char*>(const char*, const char*, std::forward_iterator_tag)::_Guard::~_Guard' from 'std::__cxx11::basic_string<char>::_M_construct<const char*>'
|
+--> 'std::__cxx11::basic_string<_CharT, _Traits, _Alloc>::_M_construct(_InIterator, _InIterator, std::forward_iterator_tag)::_Guard::~_Guard() [with _InIterator = const char*; _CharT = char; _Traits = std::char_traits<char>; _Alloc = std::allocator<char>]': events 16-18
|
| 238 | ~_Guard() { if (_M_guarded) _M_guarded->_M_dispose(); }
| | ^ ~~ ~
| | | | |
| | | | (18) ...to here
| | | (17) following 'false' branch...
| | (16) entry to 'std::__cxx11::basic_string<char>::_M_construct<const char*>(const char*, const char*, std::forward_iterator_tag)::_Guard::~_Guard'
|
<------+
|
'void std::__cxx11::basic_string<_CharT, _Traits, _Alloc>::_M_construct(_InIterator, _InIterator, std::forward_iterator_tag) [with _FwdIterator = const char*; _CharT = char; _Traits = std::char_traits<char>; _Alloc = std::allocator<char>]': event 19
|
| 248 | }
| | ^
| | |
| | (19) returning to 'std::__cxx11::basic_string<char>::_M_construct<const char*>' from 'std::__cxx11::basic_string<char>::_M_construct<const char*>(const char*, const char*, std::forward_iterator_tag)::_Guard::~_Guard'
|
<------+
|
'std::__cxx11::basic_string<_CharT, _Traits, _Alloc>::basic_string(const _CharT*, const _Alloc&) [with <template-parameter-2-1> = std::allocator<char>; _CharT = char; _Traits = std::char_traits<char>; _Alloc = std::allocator<char>]': event 20
|
|/opt/compiler-explorer/gcc-trunk-20220913/include/c++/13.0.0/bits/basic_string.h:642:21:
| 642 | _M_construct(__s, __end, forward_iterator_tag());
| | ~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
| | |
| | (20) returning to 'std::__cxx11::basic_string<char>::basic_string<>' from 'std::__cxx11::basic_string<char>::_M_construct<const char*>'
|
<------+
|
'int main()': events 21-22
|
|<source>:23:20:
| 23 | string disc1 = "Ultimate Disc";
| | ^~~~~~~~~~~~~~~
| | |
| | (21) returning to 'main' from 'std::__cxx11::basic_string<char>::basic_string<>'
| 24 | string disc2 = "Disc-Golf Disc";
| | ~~~~~~~~~~~~~~~~
| | |
| | (22) calling 'std::__cxx11::basic_string<char>::basic_string<>' from 'main'
|
+--> 'std::__cxx11::basic_string<_CharT, _Traits, _Alloc>::basic_string(const _CharT*, const _Alloc&) [with <template-parameter-2-1> = std::allocator<char>; _CharT = char; _Traits = std::char_traits<char>; _Alloc = std::allocator<char>]': events 23-26
|
|/opt/compiler-explorer/gcc-trunk-20220913/include/c++/13.0.0/bits/basic_string.h:634:7:
| 634 | basic_string(const _CharT* __s, const _Alloc& __a = _Alloc())
| | ^~~~~~~~~~~~
| | |
| | (23) entry to 'std::__cxx11::basic_string<char>::basic_string<>'
|......
| 638 | if (__s == 0)
| | ~~
| | |
| | (24) following 'false' branch (when '__s' is non-NULL)...
|......
| 641 | const _CharT* __end = __s + traits_type::length(__s);
| | ~~~~~~~~~~~~~~~~~~~~~~~~
| | |
| | (25) ...to here
| | (26) calling 'std::char_traits<char>::length' from 'std::__cxx11::basic_string<char>::basic_string<>'
|
+--> 'static constexpr std::size_t std::char_traits<char>::length(const char_type*)': events 27-29
|
|/opt/compiler-explorer/gcc-trunk-20220913/include/c++/13.0.0/bits/char_traits.h:383:7:
| 383 | length(const char_type* __s)
| | ^~~~~~
| | |
| | (27) entry to 'std::char_traits<char>::length'
|......
| 386 | if (std::__is_constant_evaluated())
| | ~~
| | |
| | (28) following 'false' branch...
|......
| 389 | return __builtin_strlen(__s);
| | ~~~~~~~~~~~~~~~~~~~~~
| | |
| | (29) ...to here
|
<------+
|
'std::__cxx11::basic_string<_CharT, _Traits, _Alloc>::basic_string(const _CharT*, const _Alloc&) [with <template-parameter-2-1> = std::allocator<char>; _CharT = char; _Traits = std::char_traits<char>; _Alloc = std::allocator<char>]': events 30-31
|
|/opt/compiler-explorer/gcc-trunk-20220913/include/c++/13.0.0/bits/basic_string.h:641:56:
| 641 | const _CharT* __end = __s + traits_type::length(__s);
| | ~~~~~~~~~~~~~~~~~~~^~~~~
| | |
| | (30) returning to 'std::__cxx11::basic_string<char>::basic_string<>' from 'std::char_traits<char>::length'
| 642 | _M_construct(__s, __end, forward_iterator_tag());
| | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
| | |
| | (31) calling 'std::__cxx11::basic_string<char>::_M_construct<const char*>' from 'std::__cxx11::basic_string<char>::basic_string<>'
|
+--> 'void std::__cxx11::basic_string<_CharT, _Traits, _Alloc>::_M_construct(_InIterator, _InIterator, std::forward_iterator_tag) [with _FwdIterator = const char*; _CharT = char; _Traits = std::char_traits<char>; _Alloc = std::allocator<char>]': events 32-33
|
|/opt/compiler-explorer/gcc-trunk-20220913/include/c++/13.0.0/bits/basic_string.tcc:217:7:
| 217 | basic_string<_CharT, _Traits, _Alloc>::
| | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
| | |
| | (32) entry to 'std::__cxx11::basic_string<char>::_M_construct<const char*>'
|......
| 248 | }
| | ~
| | |
| | (33) calling 'std::__cxx11::basic_string<char>::_M_construct<const char*>(const char*, const char*, std::forward_iterator_tag)::_Guard::~_Guard' from 'std::__cxx11::basic_string<char>::_M_construct<const char*>'
|
+--> 'std::__cxx11::basic_string<_CharT, _Traits, _Alloc>::_M_construct(_InIterator, _InIterator, std::forward_iterator_tag)::_Guard::~_Guard() [with _InIterator = const char*; _CharT = char; _Traits = std::char_traits<char>; _Alloc = std::allocator<char>]': events 34-36
|
| 238 | ~_Guard() { if (_M_guarded) _M_guarded->_M_dispose(); }
| | ^ ~~ ~
| | | | |
| | | | (36) ...to here
| | | (35) following 'false' branch...
| | (34) entry to 'std::__cxx11::basic_string<char>::_M_construct<const char*>(const char*, const char*, std::forward_iterator_tag)::_Guard::~_Guard'
|
<------+
|
'void std::__cxx11::basic_string<_CharT, _Traits, _Alloc>::_M_construct(_InIterator, _InIterator, std::forward_iterator_tag) [with _FwdIterator = const char*; _CharT = char; _Traits = std::char_traits<char>; _Alloc = std::allocator<char>]': event 37
|
| 248 | }
| | ^
| | |
| | (37) returning to 'std::__cxx11::basic_string<char>::_M_construct<const char*>' from 'std::__cxx11::basic_string<char>::_M_construct<const char*>(const char*, const char*, std::forward_iterator_tag)::_Guard::~_Guard'
|
<------+
|
'std::__cxx11::basic_string<_CharT, _Traits, _Alloc>::basic_string(const _CharT*, const _Alloc&) [with <template-parameter-2-1> = std::allocator<char>; _CharT = char; _Traits = std::char_traits<char>; _Alloc = std::allocator<char>]': event 38
|
|/opt/compiler-explorer/gcc-trunk-20220913/include/c++/13.0.0/bits/basic_string.h:642:21:
| 642 | _M_construct(__s, __end, forward_iterator_tag());
| | ~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
| | |
| | (38) returning to 'std::__cxx11::basic_string<char>::basic_string<>' from 'std::__cxx11::basic_string<char>::_M_construct<const char*>'
|
<------+
|
'int main()': events 39-44
|
|<source>:24:20:
| 24 | string disc2 = "Disc-Golf Disc";
| | ^~~~~~~~~~~~~~~~
| | |
| | (39) returning to 'main' from 'std::__cxx11::basic_string<char>::basic_string<>'
|......
| 58 | if (quantity <= 0)
| | ~~
| | |
| | (40) following 'false' branch...
|......
| 63 | if (quantity >=5 && quantity <=9)
| | ~~~~~~~~~~~~
| | |
| | (41) ...to here
|......
| 75 | else if (quantity >=30)
| | ~~
| | |
| | (42) following 'false' branch...
|......
| 79 | totalSavings = pricePerDisc * quantity * discount;
| | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
| | | |
| | | (43) ...to here
| | (44) use of uninitialized value 'discount' here
|
if (quantity <= 0)
{
cout << quantity << " is an invalid number of discs.\n";
return 0;
}
if (quantity >=5 && quantity <=9)
discount
is uninitialized when quantity
is between 1 and 4. Add another if
or change the existing ones to cover that range or initialize the variable on declaration, etc.