c - Why is gcov generating gcda files with only the executable bit set when open is wrapped? -
i have c project @ hand cmocka tests , built using cmake. try use gcov determine test coverage , use cmake module: https://github.com/bilke/cmake-modules/blob/master/codecoverage.cmake module provides make target runs test target executable (which run gcov) , runs lcov , genhtml generate report.
now, problem is, when test target executed, creates .gcda files owner's executable bit set, i. e. read bit missing. subsequently, lcov cannot read these files , produces report coverage of 0%. when chmod u+r gcda files manually afterwards , run post-test lcov commands hand, report generated (displays covered). gcda files created , valid, have unsuitable permissions set.
the problem seems stem wrapping (with ld --wrap) open function capturing returned file descriptor in test case. here minimum compiling example:
/* wrapped_open.c */ int main(void) { return 0; } int __wrap_open(const char *filename, int flags) { return __real_open(filename, flags); } # cmakelists.txt cmake_minimum_required(version 2.8) project(gcov-mvce c) add_executable(wrapped_open wrapped_open.c) target_link_libraries(wrapped_open -wl,--wrap=open ) set(cmake_module_path "${cmake_module_path};${cmake_source_dir}/cmake") include(codecoverage) set_target_properties(wrapped_open properties compile_flags "-g -o0 --coverage -fprofile-arcs -ftest-coverage" link_flags "-lgcov --coverage") setup_target_for_coverage(wrapped_open_coverage wrapped_open "coverage") # build this: cmake . -dcmake_build_type=debug # in-source build make # receive coverage report make wrapped_open_coverage # simple gcc command line compiling (no cmake required) gcc -g -o0 --coverage -fprofile-arcs -ftest-coverage -lgcov -wl,--wrap=open -o wrapped_open wrapped_open.c when wrapping of open , wrap function definition removed linker flags , code, respectively, works. files above, file wrapped_open.c.gcda created access mask 0100 , following reported lcov:
(bulid-directory)/cmakefiles/wrapped_open.dir/wrapped_open.c.gcda:cannot open data file, assuming not executed
...resulting in coverage of 0/4 lines , 0/2 functions.
why access bits wrong when open function wrapped above, though each path still calls original function unmodified parameters (at least intended do)? obvious workaround modify cmake module chmod me, rather understand going wrong when open wrapped.
please tell me in comments if , additional information might required answer this.
as pointed out in comments, open() function variable arguments. if file created, third argument file's mode. in __wrap_open implementation omitted third parameter because did not think of other code code under test call open() well. of course, gcov create gcda files , since did not specify third argument __real_open, undefined went in there mode.
so, solution include possible arguments in wrapper functions.
Comments
Post a Comment