Using this code, I am getting a segmentation fault while retrieving the values. Following pass code is trying to access some values that it was not suppose to access in this file on this line,
#ifdef CLIENT_MPO
pcli->publishStationBroadcast("MPO",
#elif CLIENT_HBW
pcli->publishStationBroadcast("HBW",
#elif CLIENT_VGR
pcli->publishStationBroadcast("VGR",
#elif CLIENT_SLD
pcli->publishStationBroadcast("SLD",
#else
#error Set CLIENT_XXX define first!
Here is the pass,
for (auto &F:M){
std::vector<std::string> arg_strings;
std::vector<Value*> arg_values;
std::string s;
raw_string_ostream rso(s);
rso << F.getName() << " ";
arg_strings.push_back(rso.str());
for(auto i = F.arg_begin();i!=F.arg_end();++i){
//errs()<<"\narg_strings: "<<*i<< ", name = " << i->getName() <<"\n";
//std::string s;
//raw_string_ostream rso(s);
rso << *i <<"\n";
arg_strings.push_back(rso.str());
arg_values.push_back(i);
}
if(F.getName().contains("message_arrived") || F.getName().contains("publish") || F.getName().contains("requestOrder")){
if(!F.isDeclaration()){
{
std::string format("arg_values: ");
for (size_t i = 0; i < arg_values.size(); ++i) {
format += " %s = %lu\n";
}
Value *str = builder.CreateGlobalStringPtr(format, "");
std::vector<Value *> argsV({str});
for (auto &v : arg_values) {
// if(v != nullptr){
argsV.push_back(builder.CreateGlobalStringPtr(v->getName(), ""));
argsV.push_back(v);
// }
}
builder.CreateCall(printfFunc, argsV, "calltmp");
}
}
}
}
Here are the error, (note: I am printing everything before segmentation fault)
User: main is calling _ZN2ft20TxtMqttFactoryClient23publishStationBroadcastENSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEdS6_S6_S6_l
_ZN2ft20TxtMqttFactoryClient23publishStationBroadcastENSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEdS6_S6_S6_l is called from this callInst invoke void @_ZN2ft20TxtMqttFactoryClient23publishStationBroadcastENSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEdS6_S6_S6_l(%"class.ft::TxtMqttFactoryClient"* noundef nonnull align 4 dereferenceable(604) %788, %"class.std::__cxx11::basic_string"* noundef %59, double noundef %786, %"class.std::__cxx11::basic_string"* noundef %61, %"class.std::__cxx11::basic_string"* noundef %62, %"class.std::__cxx11::basic_string"* noundef %64, i32 noundef 60000)
to label %803 unwind label %844, !dbg !29088
arguments: _ZN2ft20TxtMqttFactoryClient23publishStationBroadcastENSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEdS6_S6_S6_l
_ZN2ft20TxtMqttFactoryClient23publishStationBroadcastENSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEdS6_S6_S6_l %"class.ft::TxtMqttFactoryClient"* %0
_ZN2ft20TxtMqttFactoryClient23publishStationBroadcastENSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEdS6_S6_S6_l %"class.ft::TxtMqttFactoryClient"* %0%"class.std::__cxx11::basic_string"* %1
_ZN2ft20TxtMqttFactoryClient23publishStationBroadcastENSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEdS6_S6_S6_l %"class.ft::TxtMqttFactoryClient"* %0%"class.std::__cxx11::basic_string"* %1double %2
_ZN2ft20TxtMqttFactoryClient23publishStationBroadcastENSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEdS6_S6_S6_l %"class.ft::TxtMqttFactoryClient"* %0%"class.std::__cxx11::basic_string"* %1double %2%"class.std::__cxx11::basic_string"* %3
_ZN2ft20TxtMqttFactoryClient23publishStationBroadcastENSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEdS6_S6_S6_l %"class.ft::TxtMqttFactoryClient"* %0%"class.std::__cxx11::basic_string"* %1double %2%"class.std::__cxx11::basic_string"* %3%"class.std::__cxx11::basic_string"* %4
_ZN2ft20TxtMqttFactoryClient23publishStationBroadcastENSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEdS6_S6_S6_l %"class.ft::TxtMqttFactoryClient"* %0%"class.std::__cxx11::basic_string"* %1double %2%"class.std::__cxx11::basic_string"* %3%"class.std::__cxx11::basic_string"* %4%"class.std::__cxx11::basic_string"* %5
_ZN2ft20TxtMqttFactoryClient23publishStationBroadcastENSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEdS6_S6_S6_l %"class.ft::TxtMqttFactoryClient"* %0%"class.std::__cxx11::basic_string"* %1double %2%"class.std::__cxx11::basic_string"* %3%"class.std::__cxx11::basic_string"* %4%"class.std::__cxx11::basic_string"* %5i32 %6
arg_values: = 3204445520
= 3204444448
= 3889515023
Segmentation fault
I am pretty sure this is happening because of the accessing the values that doesn’t exit. But don’t know how to skip those. I tried to ignore accessing the values by checking if the value is null but didn’t work. As the arg_values is returning a list of arguments, I can’t check if the whole list is null (As there can be some values for an argument) and also can’t check the values while iterating. Then how can I skip those nullable values?