5 ms·
Isn't that the definition of branch testing, to test all possible branches within code and also testing the logic in all of those branches?
by yladiz 8y ago
Isn't that the definition of branch testing, to test all possible branches within code and also testing the logic in all of those branches?
- gregmac 8y agoConsider a line like: value = 1 / input; You can get "100% coverage" if you test that with `input = 1`, but unless you check with `input = 0` you're missing a quite important logical check.
- akvadrako 8y agoNot really - internally inputs 0 and 1 use different branches.
- RussianCow 8y agoThat's not a branch; otherwise you would have an infinite (or impossibly large) number of branches for just that one line of code. A branch is when you execute one set of code upon a given condition, and another if that condition is not met.
- qznc 8y agoIt depends on the language. In C it is not a branch because division by zero is undefined and not a path you consider. In Java you can argue that there are two branches. One branch that throws an exception and one that does not.
- zaphar 8y agoNo coverage reporting library will attempt to tell you that kind of coverage. You are essentially in violent agreement with the op but turning it into an argument by using different words for the same concept.
- akvadrako 8y agoI didn't say every number is a different branch. But on many processors, divide by zero triggers an interrupt. That's semantically the same as a branch.
- breckuh 8y agoCan't you just have a NonZeroInt type?
- whyonearth 8y agoOnly if your language supports dependent types.
- gcc_programmer 8y agoYou test all possible executions of your program when you test with all possible data inputs, which is infinite.
- paulie_a 8y agoThat is why I like using random data generators for tests. You can input some static data and then the rest is random. Every once in a while a bug pops out when you see a test fail that was previously passing.
- regecks 8y agoSQLite is heavily subjected to fuzzing already ... maybe this vulnerability was discovered that way.
- jcden 8y agoNone of the above methods are used for testing. You use boundary testing, branch testing, equivalence partitioning etc. Random data is not a good method of testing.
- jakevn 8y agoExcept for the fact that it is exactly the method that has been used to discover a large number of critical bugs in the most popular OSS projects (including SQLite): http://lcamtuf.coredump.cx/afl/ http://lcamtuf.coredump.cx/afl/
- Frizi 8y agoFuzzing isn't really practical if all you do is just generate a totally random bit stream for input. There are many much more clever and robust strategies to hit as many edge cases as possible. Check AFL[1] for some details on generating smart random input files. You can also combine that with pretty advanced dynamic execution analysis to fuzz against unknown processor instruction sets, like in sandsifter[2]. [1]: http://lcamtuf.coredump.cx/afl/ http://lcamtuf.coredump.cx/afl/ [2]: https://github.com/xoreaxeaxeax/sandsifter https://github.com/xoreaxeaxeax/sandsifter
- thaumasiotes 8y agoTesting all possible branches (each considered individually) won't get you very far in terms of testing all possible logic flows. Consider a function which checks 5 simple if-statements in a row, always in the same order. Getting each branch means you tested 10 things. But there are 32 ways for 5 if-statements to jointly evaluate. If there is a logical dependency between the state checked by one if-statement and the state checked by another one, your perfect coverage may not pick up on that. If the if-statements might be checked in an arbitrary order... there are 120 ways to order 5 things. But you'll still get perfect branch coverage by checking 10 of them.
- archgoon 8y agoint returns_less_than_twelve(int input1, int input2) { int sum = 0; if (input >= 5) { sum += 5; } if (input2 >= 5) { sum += 8; } return sum; } The following test cases will pass and achieve 100% branch coverage. int x = returns_less_than_twelve(5,0); test_assert(x < 12); int y = returns_less_than_twelve(0,5); test_assert(x < 12); However, this does not cover the entire input space so returns_less_than_twelve(5,5); test_assert(x < 12); Will fail. However, branch coverage won't tell you that there's a hole in your test coverage. Generally however, writing full branch coverage will find a lot of issues, and also cause you to really think through how your code works; but still, it doesn't guarantee correctness. If you want that you need to start bringing tools that either exhaust your input space (a function which takes 5 booleans can be exhaustively tested for correctness in trivial amounts of time), or you start modeling your chosen language well enough that you can use a mathematical prover to demonstrate that your program or function is safe on all inputs. This of course requires you to come up with a definition of 'correct' or 'safe'. For the above program, it's clear how to define correctness. For things like "Don't let an unauthorized individual access this data or data that is derived from it in a way contrary to the desires of the owner of said data" it gets 'tricky' ;).