[R-pkg-devel] New package with C++ code causes R abort in RStudio, not in R console.
Luc De Wilde
Luc@DeW||de @end|ng |rom UGent@be
Fri Nov 15 09:27:01 CET 2024
The 'parser' in lavaanC was written in two parts:
* a part in pure C/C++ without the R interface things like SEXP, etc. ; taking as input a string (the model) and a bool (produce debuginfo yes/no) , and returning a structure with all parsed information and debuginfo (if requested) or an error code (and position in the model) if an error was detected in the model; (lav_SyntaxParser.cpp + lav_SyntaxParser.h + lav_Util.cpp + lav_Util.h + lav_SmallStringList.h)
* an interface function with R which is callable from R with .Call taking SEXP model and SEXP debug as input and returning a SEXP with the parsed information in about the same format as the lavaan parser written in R returns. This interface function also evaluates the parts of the model syntax that are written as an R expression (and that can be evaluated in the Global environment). (lav_parser_interface.cpp)
The first part of parser was written using Visual Studio (the IDE I know well (for C#) because I wrote many programs in C# in this environment), and I also wrote a main function as 'replacement' for the interface function in R to be able to test this first part in Visual Studio.
When searching for the reason Rstudio aborts the R session when executing tests, I found - thanks to the help of Ivan - that there were some memory allocation or usage problems in my code. Because I work most of the time in Windows and the Address Sanitizer in R is only available on Linux/MacOS (cfr Writing R Extensions 4.3.3) I felt stuck.
Because C/C++ is relatively new to me (about 3 months) I didn't know very well the different tools for C/C++ available in Visual Studio, but looking at the documentation of Dr Memory I realized that there should also be some tools in Visual Studio to check the memory allocation and usage in C++ programs. So I found that in Visual Studio Project options -> C/C++ -> General there is an option "Enable Address Sanitizer". When I enabled it and ran the tests I found the problematic code where I allocated one byte less then needed to copy a string.
I have looked at the documentation of Dr. Memory but not yet installed it.
Luc
________________________________________
Van: Ivan Krylov <ikrylov using disroot.org>
Verzonden: donderdag 14 november 2024 21:32
Aan: Luc De Wilde <Luc.DeWilde using UGent.be>
CC: r-package-devel using r-project.org <r-package-devel using r-project.org>; Yves Rosseel <Yves.Rosseel using UGent.be>
Onderwerp: Re: [R-pkg-devel] New package with C++ code causes R abort in RStudio, not in R console.
В Thu, 14 Nov 2024 13:08:13 +0000
Luc De Wilde <Luc.DeWilde using UGent.be> пишет:
> At last, with checking of the program with address sanitizer in
> Visual Studio, I found an "off by 1 error" in my code. Now all tests
> pass without problems in Rstudio.
Congratulations on being able to solve the problem yourself!
It took me too long to figure out that the syntax errors I was getting
from lavaanC::lav_parse_model_string_c() were due to the invisible
U+00A0 (non-breakable space) characters from the e-mail. Once I ran
lav_parse_model_string_c(gsub('\ua0', ' ', model)) in a sanitized build
of R, I too saw the buffer overflow and a number of memory leaks.
Would you mind sharing with the list how you used address sanitizer
with R on Windows? Did you have to use the clang compiler, or have you
been able to use MSVC? Does Dr. Memory <https://drmemory.org/> find any
additional problems?
--
Best regards,
Ivan
More information about the R-package-devel
mailing list