Summary: First step toward addressing bad traces that happen in examples like ``` void sourceMethod() { Obj source = (Obj) InferTaint.inferSecretSource(); callSameSink(null, source); // index: 1 } void callSameSink(Obj o1, Obj o2) { callMySink1(o1); // flows via o1 ~= index 0, don't expand callMySink2(o2); // flows via o2 ~= index 1, can expand } void callMySink1(Obj o) { ... // maybe interesting something happens here that doesn't happen in callMySink2 InferTaint.inferSensitiveSink(o); // flows via o ~= index 0, can expand } void callMySink2(Obj o) { InferTaint.inferSensitiveSink(o); // flows via o ~= index 0, can expand } ``` The issue is that when we recreate a trace to the sink starting from `sourceMethod`, we don't know which of the calls to `callMySink` to expand/include in the trace. If we expand the call to `callMySink(o1)`, we'll get a bogus trace. In this example that's not such a big deal, but imagine the case where the first call to `callMySink` is a different function that transitively calls the sink through some long and confusing path. Remembering the index at which taint flows into each sink will let us choose which sinks are safe to expand. This diff just adds indexes to the API; it's not actually propagating the index info or using it during expansion yet. Reviewed By: jeremydubreil Differential Revision: D5170563 fbshipit-source-id: ba4b096master
parent
2089cd8a34
commit
97bf3324c8
Loading…
Reference in new issue