{"id":514,"date":"2014-04-13T22:08:04","date_gmt":"2014-04-14T02:08:04","guid":{"rendered":"http:\/\/zhanxw.com\/blog\/?p=514"},"modified":"2014-04-14T18:08:37","modified_gmt":"2014-04-14T22:08:37","slug":"r-package%e7%9a%84ubsan%e6%b5%8b%e8%af%95","status":"publish","type":"post","link":"https:\/\/zhanxw.com\/blog\/2014\/04\/r-package%e7%9a%84ubsan%e6%b5%8b%e8%af%95\/","title":{"rendered":"R package\u7684UBSAN\u6d4b\u8bd5"},"content":{"rendered":"<p>R package\u7684UBSAN\u6d4b\u8bd5<br \/>\nHow to perform UBSAN tests on R packages<\/p>\n<p>\u6700\u8fd1\u9700\u8981\u63d0\u4ea4\u4e00\u4e2aR package (<a href=\"http:\/\/cran.r-project.org\/web\/packages\/seqminer\/index.html\">seqminer<\/a>)\u5230CRAN\uff0c\u6211\u4eec\u9700\u8981\u4fdd\u8bc1\u8fd9\u4e2a\u5305\u4ee3\u7801\u901a\u8fc7UBSAN \u6d4b\u8bd5\uff08Undefined bahavior sanitizer tests\uff0c\u8be6\u89c1\u8fd9\u4e2a<a href=\"http:\/\/blog.regehr.org\/archives\/213\">\u94fe\u63a5<\/a>).<br \/>\n\u8fd9\u4e2a\u6d4b\u8bd5\u53ef\u4ee5\u6709\u6548\u7684\u68c0\u6d4b\u7ed3\u679c\u4e0d\u786e\u5b9a\u7684\u6307\u4ee4\uff08\u4f8b\u5982\u6253\u5370INT_MAX\uff0b1\uff09\u3002<\/p>\n<p>\u76ee\u524d\u53ea\u6709Clang\uff08\u7248\u672c3.3\u4ee5\u540e\uff09\u624d\u80fd\u652f\u6301UBSAN\u3002\u4e3a\u4e86\u5bf9R package\u8fdb\u884cUBSAN\u6d4b\u8bd5\uff0c\u6211\u4eec\u9996\u5148\u9700\u8981\u4e00\u4e2a\u7279\u6b8a\u7684R\u7248\u672c\uff0c\u5373\u7528\u6253\u5f00UBSAN\u652f\u6301(-fsanitize=undefined)\u7684Clang\u7f16\u8bd1\u7684R\u3002\u53c2\u8003\u4e86\u7f51\u4e0a\u4e00\u7bc7<a href=\"http:\/\/francoismichonneau.net\/2014\/03\/how-to-do-ubsan-tests-r-package\/\">Blog<\/a>\uff0c\u5199\u4e00\u4e0b\u7b80\u5355\u6b65\u9aa4\uff1a<\/p>\n<p>1. \u4e0b\u8f7d\u7f16\u8bd1\u5de5\u5177<\/p>\n<pre class=\"brush: bash; title: ; notranslate\" title=\"\">\r\nsudo apt-get install valgrind subversion r-base-dev clang-3.4 texlive-fonts-extra texlive-latex-extra\r\nsudo apt-get build-dep cran-base\r\n<\/pre>\n<p>2. \u4e0b\u8f7dR\u6e90\u4ee3\u7801\uff08devel\u7248\u672c\uff09<\/p>\n<pre class=\"brush: bash; title: ; notranslate\" title=\"\">\r\nsvn co https:\/\/svn.r-project.org\/R\/trunk ~\/R-devel\r\n<\/pre>\n<p>3. \u66ff\u6362R-devel\/config.site<\/p>\n<pre class=\"brush: bash; title: ; notranslate\" title=\"\">\r\nCC=&quot;clang -std=gnu99 -fsanitize=undefined&quot;\r\nCFLAGS=&quot;-fno-omit-frame-pointer -Wall -pedantic -mtune=native&quot;\r\nF77=&quot;gfortran&quot;\r\nLIBnn=&quot;lib64&quot;\r\nLDFLAGS=&quot;-L\/usr\/local\/lib64 -L\/usr\/local\/lib&quot;\r\nCXX=&quot;clang++ -std=c++11 -fsanitize=undefined&quot;\r\nCXXFLAGS=&quot;-fno-omit-frame-pointer -Wall -pedantic -mtune=native&quot;\r\nFC=${F77}\r\n<\/pre>\n<p>4. \u7f16\u8bd1 <\/p>\n<pre class=\"brush: bash; title: ; notranslate\" title=\"\">\r\ncd R-devel\r\n.\/configure --with-x=no --without-recommended-packages\r\nmake\r\n<\/pre>\n<p>\u8fd9\u91cc&#8211;without-recommended-packages\u4f1a\u7701\u7565\u4e00\u4e9bR\u7684packages\uff08\u4f8b\u5982boot,nlme,Matrix) \u4ee5\u63d0\u5347\u7f16\u8bd1\u901f\u5ea6\u3002\u5982\u679c\u4e0d\u7528\u8fd9\u4e2a\u9009\u9879\uff0c\u6211\u53d1\u73b0Matrix package\u603b\u662f\u6ca1\u6cd5\u7f16\u8bd1<\/p>\n<p>5. \u5efa\u7acb~\/.R\/Makevars<\/p>\n<pre class=\"brush: bash; title: ; notranslate\" title=\"\">\r\nCC = clang -std=gnu99 -fsanitize=undefined -fno-omit-frame-pointer\r\nCXX = clang++ -fsanitize=undefined -fno-omit-frame-pointer\r\nPKG_LIBS = \/usr\/lib\/llvm-3.4\/lib\/clang\/3.4\/lib\/linux\/libclang_rt.ubsan_cxx-x86_64.a\r\n<\/pre>\n<p>\u8fd9\u91ccCXX \u4e00\u5b9a\u8981\u7528clang++\uff0c\u5982\u679c\u7528clang\u7684\u8bdd\u4f1a\u51fa\u73b0\u94fe\u63a5\u9519\u8bef\uff0c\u6bd4\u5982\u627e\u4e0d\u5230\u8fd9\u4e2a\u7b26\u53f7\uff1a _ZTVN10__cxxabiv117__class_type_infoE<\/p>\n<p>\u8fd9\u91cc\u8fd8\u9700\u8981\u6307\u5b9aPKG_LIBS\u5305\u62ecLLVM\u7684\u5e93\u6587\u4ef6\uff0c\u4e0d\u7136\u5c31\u627e\u4e0d\u5230UBSAN\u7684\u7b26\u53f7\u3002<\/p>\n<p>6. \u6d4b\u8bd5package<\/p>\n<pre class=\"brush: bash; title: ; notranslate\" title=\"\">\r\nR CMD build seqminer\/\r\nR CMD check seqminer_2.7.tar.gz\r\n<\/pre>\n<p>UBSAN\u6d4b\u8bd5\u7684\u7ed3\u679c\u4f1a\u663e\u793a\u5728\uff1aseqminer.Rcheck\/tests\/tests.Rout<br \/>\n\u5982\u679c\u6709\u9519\u8bef\uff0c\u4f60\u4f1a\u770b\u5f88\u957f\u7684\u4e00\u884c\uff0c runtime error&#8230;.<\/p>\n<p>\u5176\u4ed6\u6280\u5de7<\/p>\n<p>\u68c0\u6d4b\u5185\u5b58\u8fd8\u53ef\u4ee5\u7528valgrind\uff1a<\/p>\n<pre class=\"brush: bash; title: ; notranslate\" title=\"\">\r\nR CMD check --use-valgrind seqminer_2.7.tar.gz\r\nR -d valgrind --vanilla &lt; mypkg-Ex.R\r\nR -d &quot;valgrind --tool=memcheck --leak-check=full&quot; --vanilla &lt; mypkg-Ex.R\r\n<\/pre>\n","protected":false},"excerpt":{"rendered":"<p>R package\u7684UBSAN\u6d4b\u8bd5 How to perform UBSAN tests on R packages \u6700\u8fd1\u9700\u8981\u63d0\u4ea4\u4e00\u4e2aR package (seqminer)\u5230CRAN\uff0c\u6211\u4eec\u9700\u8981\u4fdd\u8bc1\u8fd9\u4e2a\u5305\u4ee3\u7801\u901a\u8fc7UBSAN \u6d4b\u8bd5\uff08Undefined bahavior sanitizer tests\uff0c\u8be6\u89c1\u8fd9\u4e2a\u94fe\u63a5). \u8fd9\u4e2a\u6d4b\u8bd5\u53ef\u4ee5\u6709\u6548\u7684\u68c0\u6d4b\u7ed3\u679c\u4e0d\u786e\u5b9a\u7684\u6307\u4ee4\uff08\u4f8b\u5982\u6253\u5370INT_MAX\uff0b1\uff09\u3002 \u76ee\u524d\u53ea\u6709Clang\uff08\u7248\u672c3.3\u4ee5\u540e\uff09\u624d\u80fd\u652f\u6301UBSAN\u3002\u4e3a\u4e86\u5bf9R package\u8fdb\u884cUBSAN\u6d4b\u8bd5\uff0c\u6211\u4eec\u9996\u5148\u9700\u8981\u4e00\u4e2a\u7279\u6b8a\u7684R\u7248\u672c\uff0c\u5373\u7528\u6253\u5f00UBSAN\u652f\u6301(-fsanitize=undefined)\u7684Clang\u7f16\u8bd1\u7684R\u3002\u53c2\u8003\u4e86\u7f51\u4e0a\u4e00\u7bc7Blog\uff0c\u5199\u4e00\u4e0b\u7b80\u5355\u6b65\u9aa4\uff1a 1. \u4e0b\u8f7d\u7f16\u8bd1\u5de5\u5177 sudo apt-get install valgrind subversion r-base-dev clang-3.4 texlive-fonts-extra texlive-latex-extra sudo apt-get build-dep cran-base 2. \u4e0b\u8f7dR\u6e90\u4ee3\u7801\uff08devel\u7248\u672c\uff09 svn co https:\/\/svn.r-project.org\/R\/trunk ~\/R-devel 3. \u66ff\u6362R-devel\/config.site CC=&quot;clang -std=gnu99 -fsanitize=undefined&quot; CFLAGS=&quot;-fno-omit-frame-pointer -Wall -pedantic -mtune=native&quot; F77=&quot;gfortran&quot; LIBnn=&quot;lib64&quot; LDFLAGS=&quot;-L\/usr\/local\/lib64 -L\/usr\/local\/lib&quot; CXX=&quot;clang++ [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[11],"tags":[132,45,131,77],"class_list":["post-514","post","type-post","status-publish","format-standard","hentry","category-sysadmin","tag-cran","tag-r","tag-ubsan","tag-valgrind"],"_links":{"self":[{"href":"https:\/\/zhanxw.com\/blog\/wp-json\/wp\/v2\/posts\/514","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/zhanxw.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/zhanxw.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/zhanxw.com\/blog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/zhanxw.com\/blog\/wp-json\/wp\/v2\/comments?post=514"}],"version-history":[{"count":0,"href":"https:\/\/zhanxw.com\/blog\/wp-json\/wp\/v2\/posts\/514\/revisions"}],"wp:attachment":[{"href":"https:\/\/zhanxw.com\/blog\/wp-json\/wp\/v2\/media?parent=514"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/zhanxw.com\/blog\/wp-json\/wp\/v2\/categories?post=514"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/zhanxw.com\/blog\/wp-json\/wp\/v2\/tags?post=514"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}