On Thu, Mar 19, 2015 at 10:40:32PM +0100, Matthias Klose wrote: > On 03/18/2015 11:39 AM, David Kalnischkies wrote: > > Attached is as far as I got in terms of a testcase. Still depends on > > libapt as if I make the method directly available everything is fine… > > would it be possible to have a test case which doesn't link the library, maybe > by including all relevant files so that we have a single translation unit?
meehh, figured out now what is missing to get this to reproduce in a smaller case which makes this a rather big mistake on my side: The VectorizeString function has the 'const' attribute applied which is documented as not to be used if pointers are involved, but the char& parameter is a char* in disguise… (in a perfect world the & wouldn't be there). Attached the 'fixed' code to reproduce this just in case. [going with 'pure' for the time being now as good enough, it isn't called as much as it used to be anyway - if I remember right] Its a bit misfortune that g++ isn't indicating this misuse (and the result is a bit strange, too), but that is at most a wishlist I guess, so feel free to close if you want. Best regards David Kalnischkies
// g++ -Wall -Wextra -O0 -lapt-pkg /tmp/test.cc -o /tmp/test && /tmp/test // g++ -Wall -Wextra -O2 -lapt-pkg /tmp/test.cc -o /tmp/test && /tmp/test #include <string> #include <map> #include <vector> #include <iostream> std::vector<std::string> VectorizeString(std::string const &haystack, char const &split) __attribute__((const)); std::vector<std::string> VectorizeString(std::string const &haystack, char const &split) { std::vector<std::string> exploded; if (haystack.empty() == true) return exploded; std::string::const_iterator start = haystack.begin(); std::string::const_iterator end = start; do { for (; end != haystack.end() && *end != split; ++end); exploded.push_back(std::string(start, end)); start = end + 1; } while (end != haystack.end() && (++end) != haystack.end()); return exploded; } std::vector<std::string> getDefaultVector() { std::vector<std::string> r; // broken g++-4.x & g++-5 //static std::vector<std::string> r; // just g++-5 return r; } void parseOptions(std::map<std::string, std::string> const &Options, std::string const &field) { std::map<std::string, std::string>::const_iterator arch = Options.find(field); std::vector<std::string> Archs = (arch != Options.end()) ? VectorizeString(arch->second, ',') : getDefaultVector(); // <- never called, but method content effects result for (std::vector<std::string>::const_iterator a = Archs.begin(); a != Archs.end(); ++a) std::cout << *a << std::endl; } int main() { std::map<std::string, std::string> Options; Options["a"] = "amd64,i386,armel"; parseOptions(Options, "a"); return 0; }
signature.asc
Description: Digital signature