This is perhaps a bit OT (or more than a bit). I'm eager to work with a new macro for Open Office that inserts LilyPond-encoded music fragments into an OOo document, but I've hit an unusual snag. The macro is installed correctly, but when I try to use it I receive this error:

terminate called after throwing an instance of
'std::logic_error'
what():basic_string::_S_construct
          NULL not valid

It almost looks poetic. :)

Alas, Google wasn't much help, and the author of the macro has no idea why this error results (his code contains no C++). Can any C++ guru here shed any light on the how/what/why of the error ? Maybe even suggest a fix ?

The following program produces the exact error message (aka throws this c++ exception):
$ cat a.cpp
#include <string>
int main()
{
  std::string s(NULL);
  return 0;
}
$ c++ a.cpp
$ ./a.out
terminate called after throwing an instance of 'std::logic_error'
  what():  basic_string::_S_construct NULL not valid
Aborted (core dumped)

So somewhere in the OOo code a std::string object is created but it is passed a null pointer in the constructor. Of course you should not find a call like "std::string s(NULL);" in the OOo codebase, but more likely something like "std::string s(somestr);" where "somestr" is a "char*". It could also result from a function call like

void foo(std::string s) { }
char *str=NULL;
foo(str);

However the following test program shows a different behaviour:
$ cat b.cpp
#include <string>
int main()
{
  char *str=NULL;
  std::string s;
  s=str;
  return 0;
}
$ c++ b.cpp
$ ./a.out
Segmentation fault (core dumped)

This is the reason I suspect an array call to be the likeliest case for throwing the exception.

Now how to fix this? I suggest you compile yourself OOo with debugging enabled, then run your OOo with gdb and do your tests which should throw the exception. Then you can easily backtrace (bt) or go up (up) untill you find the throwling source code line. Then you can choose to either do a quick'n'dirty fix and just prefix the string construction with some "if(str==NULL)return;" or similar or look further to fix the reason why the C-String has not been initialized correctly (thus still be NULL).

--
---> Dirk Jagdmann ^ doj / cubic
----> http://cubic.org/~doj
-----> http://llg.cubic.org

Reply via email to