brave-experiments / ad-block

Ad block engine used in the Brave browser for ABP filter syntax based lists like EasyList.
https://www.brave.com
Mozilla Public License 2.0
239 stars 95 forks source link

Fix valgrind warnings #164

Closed iefremov closed 5 years ago

iefremov commented 5 years ago

Simply running valgrind ./build/out/Default/test produces lots of memory access errors (mostly mismatched new[]/delete and some wrong memory accesses). Need to fix this and also run JS tests using valgrind.

List of errors: https://pastebin.com/R8LwJNud

iefremov commented 5 years ago

Less errors after fixing the new/delete issue:

valgrind ./build/out/Default/test 
==5161== Memcheck, a memory error detector
==5161== Copyright (C) 2002-2017, and GNU GPL'd, by Julian Seward et al.
==5161== Using Valgrind-3.13.0 and LibVEX; rerun with -h for copyright info
==5161== Command: ./build/out/Default/test
==5161== 
....................Unrecognized filter option: %&'()*+
Unrecognized filter option: :;<=>?@/\^_`{|}~-]).*[a-zA-Z0-9]+/$script
.==5161== Invalid read of size 1
==5161==    at 0x182835: Filter::matches(char const*, int, FilterOption, char const*, BloomFilter*, char const*, int) (in /home/iefremov/ig/ad-block/build/out/Default/test)
==5161==    by 0x1792E9: isHostAnchoredHashSetMiss(char const*, int, HashSet<Filter>*, char const*, int, FilterOption, char const*, Filter**) (in /home/iefremov/ig/ad-block/build/out/Default/test)
==5161==    by 0x17978E: AdBlockClient::matches(char const*, FilterOption, char const*) (in /home/iefremov/ig/ad-block/build/out/Default/test)
==5161==    by 0x165D6D: parse_spam404_main_blacklistclientTest::run(TestResult&) (in /home/iefremov/ig/ad-block/build/out/Default/test)
==5161==    by 0x185F8D: TestRegistry::run(TestResult&) (in /home/iefremov/ig/ad-block/build/out/Default/test)
==5161==    by 0x185E92: TestRegistry::runAllTests(TestResult&) (in /home/iefremov/ig/ad-block/build/out/Default/test)
==5161==    by 0x15B50D: main (in /home/iefremov/ig/ad-block/build/out/Default/test)
==5161==  Address 0x6de0264 is 0 bytes after a block of size 20 alloc'd
==5161==    at 0x4C3089F: operator new[](unsigned long) (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==5161==    by 0x181046: Filter::Filter(Filter const&) (in /home/iefremov/ig/ad-block/build/out/Default/test)
==5161==    by 0x17F353: HashSet<Filter>::Add(Filter const&, bool) (in /home/iefremov/ig/ad-block/build/out/Default/test)
==5161==    by 0x17819E: parseFilter(char const*, char const*, Filter*, BloomFilter*, BloomFilter*, HashSet<Filter>*, HashSet<Filter>*, HashSet<CosmeticFilter>*, bool) (in /home/iefremov/ig/ad-block/build/out/Default/test)
==5161==    by 0x17BCFA: AdBlockClient::parse(char const*, bool) (in /home/iefremov/ig/ad-block/build/out/Default/test)
==5161==    by 0x16595E: parse_spam404_main_blacklistclientTest::run(TestResult&) (in /home/iefremov/ig/ad-block/build/out/Default/test)
==5161==    by 0x185F8D: TestRegistry::run(TestResult&) (in /home/iefremov/ig/ad-block/build/out/Default/test)
==5161==    by 0x185E92: TestRegistry::runAllTests(TestResult&) (in /home/iefremov/ig/ad-block/build/out/Default/test)
==5161==    by 0x15B50D: main (in /home/iefremov/ig/ad-block/build/out/Default/test)
==5161== 
......==5161== Invalid read of size 1
==5161==    at 0x182835: Filter::matches(char const*, int, FilterOption, char const*, BloomFilter*, char const*, int) (in /home/iefremov/ig/ad-block/build/out/Default/test)
==5161==    by 0x1792E9: isHostAnchoredHashSetMiss(char const*, int, HashSet<Filter>*, char const*, int, FilterOption, char const*, Filter**) (in /home/iefremov/ig/ad-block/build/out/Default/test)
==5161==    by 0x17978E: AdBlockClient::matches(char const*, FilterOption, char const*) (in /home/iefremov/ig/ad-block/build/out/Default/test)
==5161==    by 0x1612E4: checkOptionRule(char const*, std::set<OptionRuleData, std::less<OptionRuleData>, std::allocator<OptionRuleData> >&&)::{lambda(OptionRuleData const&)#1}::operator()(OptionRuleData const&) const (in /home/iefremov/ig/ad-block/build/out/Default/test)
==5161==    by 0x169738: checkOptionRule(char const*, std::set<OptionRuleData, std::less<OptionRuleData>, std::allocator<OptionRuleData> >&&)::{lambda(OptionRuleData const&)#1} std::for_each<std::_Rb_tree_const_iterator<OptionRuleData>, checkOptionRule(char const*, std::set<OptionRuleData, std::less<OptionRuleData>, std::allocator<OptionRuleData> >&&)::{lambda(OptionRuleData const&)#1}>(std::_Rb_tree_const_iterator<OptionRuleData>, checkOptionRule(char const*, std::set<OptionRuleData, std::less<OptionRuleData>, std::allocator<OptionRuleData> >&&)::{lambda(OptionRuleData const&)#1}, checkOptionRule(char const*, std::set<OptionRuleData, std::less<OptionRuleData>, std::allocator<OptionRuleData> >&&)::{lambda(OptionRuleData const&)#1}) (in /home/iefremov/ig/ad-block/build/out/Default/test)
==5161==    by 0x161422: checkOptionRule(char const*, std::set<OptionRuleData, std::less<OptionRuleData>, std::allocator<OptionRuleData> >&&) (in /home/iefremov/ig/ad-block/build/out/Default/test)
==5161==    by 0x16159D: optionRulesclientTest::run(TestResult&) (in /home/iefremov/ig/ad-block/build/out/Default/test)
==5161==    by 0x185F8D: TestRegistry::run(TestResult&) (in /home/iefremov/ig/ad-block/build/out/Default/test)
==5161==    by 0x185E92: TestRegistry::runAllTests(TestResult&) (in /home/iefremov/ig/ad-block/build/out/Default/test)
==5161==    by 0x15B50D: main (in /home/iefremov/ig/ad-block/build/out/Default/test)
==5161==  Address 0x69187bb is 0 bytes after a block of size 11 alloc'd
==5161==    at 0x4C3089F: operator new[](unsigned long) (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==5161==    by 0x181046: Filter::Filter(Filter const&) (in /home/iefremov/ig/ad-block/build/out/Default/test)
==5161==    by 0x17F353: HashSet<Filter>::Add(Filter const&, bool) (in /home/iefremov/ig/ad-block/build/out/Default/test)
==5161==    by 0x17819E: parseFilter(char const*, char const*, Filter*, BloomFilter*, BloomFilter*, HashSet<Filter>*, HashSet<Filter>*, HashSet<CosmeticFilter>*, bool) (in /home/iefremov/ig/ad-block/build/out/Default/test)
==5161==    by 0x17BCFA: AdBlockClient::parse(char const*, bool) (in /home/iefremov/ig/ad-block/build/out/Default/test)
==5161==    by 0x1613D5: checkOptionRule(char const*, std::set<OptionRuleData, std::less<OptionRuleData>, std::allocator<OptionRuleData> >&&) (in /home/iefremov/ig/ad-block/build/out/Default/test)
==5161==    by 0x16159D: optionRulesclientTest::run(TestResult&) (in /home/iefremov/ig/ad-block/build/out/Default/test)
==5161==    by 0x185F8D: TestRegistry::run(TestResult&) (in /home/iefremov/ig/ad-block/build/out/Default/test)
==5161==    by 0x185E92: TestRegistry::runAllTests(TestResult&) (in /home/iefremov/ig/ad-block/build/out/Default/test)
==5161==    by 0x15B50D: main (in /home/iefremov/ig/ad-block/build/out/Default/test)
==5161== 
==5161== Invalid read of size 1
==5161==    at 0x182835: Filter::matches(char const*, int, FilterOption, char const*, BloomFilter*, char const*, int) (in /home/iefremov/ig/ad-block/build/out/Default/test)
==5161==    by 0x1791E9: isHostAnchoredHashSetMiss(char const*, int, HashSet<Filter>*, char const*, int, FilterOption, char const*, Filter**) (in /home/iefremov/ig/ad-block/build/out/Default/test)
==5161==    by 0x17978E: AdBlockClient::matches(char const*, FilterOption, char const*) (in /home/iefremov/ig/ad-block/build/out/Default/test)
==5161==    by 0x1612E4: checkOptionRule(char const*, std::set<OptionRuleData, std::less<OptionRuleData>, std::allocator<OptionRuleData> >&&)::{lambda(OptionRuleData const&)#1}::operator()(OptionRuleData const&) const (in /home/iefremov/ig/ad-block/build/out/Default/test)
==5161==    by 0x169738: checkOptionRule(char const*, std::set<OptionRuleData, std::less<OptionRuleData>, std::allocator<OptionRuleData> >&&)::{lambda(OptionRuleData const&)#1} std::for_each<std::_Rb_tree_const_iterator<OptionRuleData>, checkOptionRule(char const*, std::set<OptionRuleData, std::less<OptionRuleData>, std::allocator<OptionRuleData> >&&)::{lambda(OptionRuleData const&)#1}>(std::_Rb_tree_const_iterator<OptionRuleData>, checkOptionRule(char const*, std::set<OptionRuleData, std::less<OptionRuleData>, std::allocator<OptionRuleData> >&&)::{lambda(OptionRuleData const&)#1}, checkOptionRule(char const*, std::set<OptionRuleData, std::less<OptionRuleData>, std::allocator<OptionRuleData> >&&)::{lambda(OptionRuleData const&)#1}) (in /home/iefremov/ig/ad-block/build/out/Default/test)
==5161==    by 0x161422: checkOptionRule(char const*, std::set<OptionRuleData, std::less<OptionRuleData>, std::allocator<OptionRuleData> >&&) (in /home/iefremov/ig/ad-block/build/out/Default/test)
==5161==    by 0x161846: optionRulesclientTest::run(TestResult&) (in /home/iefremov/ig/ad-block/build/out/Default/test)
==5161==    by 0x185F8D: TestRegistry::run(TestResult&) (in /home/iefremov/ig/ad-block/build/out/Default/test)
==5161==    by 0x185E92: TestRegistry::runAllTests(TestResult&) (in /home/iefremov/ig/ad-block/build/out/Default/test)
==5161==    by 0x15B50D: main (in /home/iefremov/ig/ad-block/build/out/Default/test)
==5161==  Address 0x68e50cc is 0 bytes after a block of size 12 alloc'd
==5161==    at 0x4C3089F: operator new[](unsigned long) (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==5161==    by 0x181046: Filter::Filter(Filter const&) (in /home/iefremov/ig/ad-block/build/out/Default/test)
==5161==    by 0x17F353: HashSet<Filter>::Add(Filter const&, bool) (in /home/iefremov/ig/ad-block/build/out/Default/test)
==5161==    by 0x17819E: parseFilter(char const*, char const*, Filter*, BloomFilter*, BloomFilter*, HashSet<Filter>*, HashSet<Filter>*, HashSet<CosmeticFilter>*, bool) (in /home/iefremov/ig/ad-block/build/out/Default/test)
==5161==    by 0x17BCFA: AdBlockClient::parse(char const*, bool) (in /home/iefremov/ig/ad-block/build/out/Default/test)
==5161==    by 0x1613D5: checkOptionRule(char const*, std::set<OptionRuleData, std::less<OptionRuleData>, std::allocator<OptionRuleData> >&&) (in /home/iefremov/ig/ad-block/build/out/Default/test)
==5161==    by 0x161846: optionRulesclientTest::run(TestResult&) (in /home/iefremov/ig/ad-block/build/out/Default/test)
==5161==    by 0x185F8D: TestRegistry::run(TestResult&) (in /home/iefremov/ig/ad-block/build/out/Default/test)
==5161==    by 0x185E92: TestRegistry::runAllTests(TestResult&) (in /home/iefremov/ig/ad-block/build/out/Default/test)
==5161==    by 0x15B50D: main (in /home/iefremov/ig/ad-block/build/out/Default/test)
==5161== 
..
There were no test failures
==5161== 
==5161== HEAP SUMMARY:
==5161==     in use at exit: 0 bytes in 0 blocks
==5161==   total heap usage: 978,473 allocs, 978,473 frees, 92,458,879 bytes allocated
==5161== 
==5161== All heap blocks were freed -- no leaks are possible
==5161== 
==5161== For counts of detected and suppressed errors, rerun with: -v
==5161== ERROR SUMMARY: 5 errors from 3 contexts (suppressed: 0 from 0)