Libsass: تجاوز المخزن المؤقت MSVC x86_64 في الإبلاغ عن الخطأ (الانحدار بين 3.3.5 و 3.3.6)

تم إنشاؤها على ٢٤ أبريل ٢٠١٦  ·  14تعليقات  ·  مصدر: sass/libsass

يأتي هذا في الأصل من https://github.com/dahlia/libsass-python/pull/149

أواجه صعوبة في الالتفاف حول _لماذا_ يحدث هذا بالضبط ، لكني سأقوم بنشر ما لدي حتى الآن :)

يبدو أن هذا الالتزام يسبب المشكلة التي أراها: https://github.com/sass/libsass/commit/527f3a8 (# 2025)
يبدو أن التحقق من المراجعة قبل ذلك (f8cad4e) قد نجح.

بلدي تسخير الاختبار الصغير

يمكنك عرض الكود هنا إذا كان ذلك أسهل: https://github.com/asottile/libsass/commit/f40ae24025234b73ca86adece62dec0e35884eb1

main.cpp

#include <sass/context.h>
#include <iostream>

int main() {
    std::cout << "Making data context" << std::endl;
    struct Sass_Data_Context* context = sass_make_data_context(sass_copy_c_string(""));
    std::cout << "Compiling data context" << std::endl;
    sass_compile_data_context(context);
    std::cout << "Getting output context" << std::endl;
    struct Sass_Context* ctx = sass_data_context_get_context(context);
    std::cout << "Printing error status" << std::endl;
    std::cout << sass_context_get_error_status(ctx) << std::endl;
    std::cout << "Printing error message" << std::endl;
    std::cout << sass_context_get_error_message(ctx) << std::endl;
    sass_delete_data_context(context);

    return 0;
}

اختبار

"D:\Programs\VS2015\VC\BIN\amd64\cl.exe" ^
    /I.\include -ID:\Programs\VS2015\VC\INCLUDE ^
    /c /nologo /W3 /WX- /GL /DNDEBUG -O2 /Oi /Zi /EHsc /MT ^
    src/*.c
"D:\Programs\VS2015\VC\BIN\amd64\cl.exe" ^
    /I.\include ^
    "-ID:\Programs\VS2015\VC\INCLUDE" ^
    "-ID:\Programs\VS2015\VC\ATLMFC\INCLUDE" ^
    "-IC:\Program Files (x86)\Windows Kits\10\include\10.0.10240.0\ucrt" ^
    "-IC:\Program Files (x86)\Windows Kits\NETFXSDK\4.6.1\include\um" ^
    "-IC:\Program Files (x86)\Windows Kits\8.1\include\\shared" ^
    "-IC:\Program Files (x86)\Windows Kits\8.1\include\\um" ^
    "-IC:\Program Files (x86)\Windows Kits\8.1\include\\winrt" ^
    /c /nologo /W3 /WX- /GL /DNDEBUG -O2 /Oi /Zi /EHsc /MT ^
    ./main.cpp src/*.cpp 
"D:\Programs\VS2015\VC\BIN\amd64\link.exe" ^
    "-LIBPATH:D:\Programs\VS2015\VC\LIB\amd64" ^
    "-LIBPATH:D:\Programs\VS2015\VC\ATLMFC\LIB\amd64" ^
    "-LIBPATH:C:\Program Files (x86)\Windows Kits\10\lib\10.0.10240.0\ucrt\x64" ^
    "-LIBPATH:C:\Program Files (x86)\Windows Kits\NETFXSDK\4.6.1\lib\um\x64" ^
    "-LIBPATH:C:\Program Files (x86)\Windows Kits\8.1\lib\winv6.3\um\x64" ^
    "-INCREMENTAL:NO" "-OUT:main.exe" "-Debug" "-nologo" "-LTCG" ^
    *.obj
main.exe

الإخراج في f8cad4e

C:\Users\Anthony\Desktop\git\libsass-python\libsass>"D:\Programs\VS2015\VC\BIN\amd64\cl.exe"     /I.\include -ID:\Programs\VS2015\VC\INCLUDE     /c /nologo /W3 /WX- /GL /DNDEBUG -O2 /Oi /Zi /EHsc /MT     src/*.c
c99func.c
cencode.c

C:\Users\Anthony\Desktop\git\libsass-python\libsass>"D:\Programs\VS2015\VC\BIN\amd64\cl.exe"     /I.\include     "-ID:\Programs\VS2015\VC\INCLUDE"     "-ID:\Programs\VS2015\VC\ATLMFC\INCLUDE"     "-IC:\Program Files (x86)\Windows Kits\10\include\10.0.10240.0\ucrt"     "-IC:\Program Files (x86)\Windows Kits\NETFXSDK\4.6.1\include\um"     "-IC:\Program Files (x86)\Windows Kits\8.1\include\\shared"     "-IC:\Program Files (x86)\Windows Kits\8.1\include\\um"     "-IC:\Program Files (x86)\Windows Kits\8.1\include\\winrt"     /c /nologo /W3 /WX- /GL /DNDEBUG -O2 /Oi /Zi /EHsc /MT     ./main.cpp src/*.cpp
main.cpp
ast.cpp
base64vlq.cpp
bind.cpp
src/bind.cpp(175): warning C4267: 'initializing': conversion from 'size_t' to 'int', possible loss of data
color_maps.cpp
constants.cpp
context.cpp
cssize.cpp
emitter.cpp
environment.cpp
error_handling.cpp
eval.cpp
expand.cpp
extend.cpp
file.cpp
functions.cpp
inspect.cpp
json.cpp
lexer.cpp
listize.cpp
Compiling...
memory_manager.cpp
node.cpp
output.cpp
parser.cpp
plugins.cpp
position.cpp
prelexer.cpp
remove_placeholders.cpp
sass.cpp
sass2scss.cpp
sass_context.cpp
sass_functions.cpp
sass_util.cpp
sass_values.cpp
source_map.cpp
to_c.cpp
to_value.cpp
units.cpp
utf8_string.cpp
util.cpp
Compiling...
values.cpp

C:\Users\Anthony\Desktop\git\libsass-python\libsass>"D:\Programs\VS2015\VC\BIN\amd64\link.exe"     "-LIBPATH:D:\Programs\VS2015\VC\LIB\amd64"     "-LIBPATH:D:\Programs\VS2015\VC\ATLMFC\LIB\amd64"     "-LIBPATH:C:\Program Files (x86)\Windows Kits\10\lib\10.0.10240.0\ucrt\x64"     "-LIBPATH:C:\Program Files (x86)\Windows Kits\NETFXSDK\4.6.1\lib\um\x64"     "-LIBPATH:C:\Program Files (x86)\Windows Kits\8.1\lib\winv6.3\um\x64"     "-INCREMENTAL:NO" "-OUT:main.exe" "-Debug" "-nologo" "-LTCG"     *.obj
Generating code
Finished generating code

C:\Users\Anthony\Desktop\git\libsass-python\libsass>main.exe
Making data context
Compiling data context
Getting output context
Printing error status
3
Printing error message
Internal Error: Data context created with empty source string

الإخراج عند 527f3a8

C:\Users\Anthony\Desktop\git\libsass-python\libsass>"D:\Programs\VS2015\VC\BIN\amd64\cl.exe"     /I.\include -ID:\Programs\VS2015\VC\INCLUDE     /c /nologo /W3 /WX- /GL /DNDEBUG -O2 /Oi /Zi /EHsc /MT     src/*.c
c99func.c
cencode.c

C:\Users\Anthony\Desktop\git\libsass-python\libsass>"D:\Programs\VS2015\VC\BIN\amd64\cl.exe"     /I.\include     "-ID:\Programs\VS2015\VC\INCLUDE"     "-ID:\Programs\VS2015\VC\ATLMFC\INCLUDE"     "-IC:\Program Files (x86)\Windows Kits\10\include\10.0.10240.0\ucrt"     "-IC:\Program Files (x86)\Windows Kits\NETFXSDK\4.6.1\include\um"     "-IC:\Program Files (x86)\Windows Kits\8.1\include\\shared"     "-IC:\Program Files (x86)\Windows Kits\8.1\include\\um"     "-IC:\Program Files (x86)\Windows Kits\8.1\include\\winrt"     /c /nologo /W3 /WX- /GL /DNDEBUG -O2 /Oi /Zi /EHsc /MT     ./main.cpp src/*.cpp
main.cpp
ast.cpp
base64vlq.cpp
bind.cpp
src/bind.cpp(175): warning C4267: 'initializing': conversion from 'size_t' to 'int', possible loss of data
color_maps.cpp
constants.cpp
context.cpp
cssize.cpp
emitter.cpp
environment.cpp
error_handling.cpp
eval.cpp
expand.cpp
extend.cpp
file.cpp
functions.cpp
inspect.cpp
json.cpp
lexer.cpp
listize.cpp
Compiling...
memory_manager.cpp
node.cpp
output.cpp
parser.cpp
plugins.cpp
position.cpp
prelexer.cpp
remove_placeholders.cpp
sass.cpp
sass2scss.cpp
sass_context.cpp
sass_functions.cpp
sass_util.cpp
sass_values.cpp
source_map.cpp
to_c.cpp
to_value.cpp
units.cpp
utf8_string.cpp
util.cpp
Compiling...
values.cpp

C:\Users\Anthony\Desktop\git\libsass-python\libsass>"D:\Programs\VS2015\VC\BIN\amd64\link.exe"     "-LIBPATH:D:\Programs\VS2015\VC\LIB\amd64"     "-LIBPATH:D:\Programs\VS2015\VC\ATLMFC\LIB\amd64"     "-LIBPATH:C:\Program Files (x86)\Windows Kits\10\lib\10.0.10240.0\ucrt\x64"     "-LIBPATH:C:\Program Files (x86)\Windows Kits\NETFXSDK\4.6.1\lib\um\x64"     "-LIBPATH:C:\Program Files (x86)\Windows Kits\8.1\lib\winv6.3\um\x64"     "-INCREMENTAL:NO" "-OUT:main.exe" "-Debug" "-nologo" "-LTCG"     *.obj
Generating code
Finished generating code

C:\Users\Anthony\Desktop\git\libsass-python\libsass>main.exe
Making data context

يؤدي إرفاق مصحح الأخطاء عند الفشل إلى ظهور الرسالة التالية:

Unhandled exception at 0x00007FF77A8F8814 in main.exe: Stack cookie instrumentation code detected a stack-based buffer overrun.

ويسقط نقطة توقف على: https://github.com/sass/libsass/blob/527f3a8/src/sass_context.cpp#L143

Bug - Confirmed Dev - PR Ready

ال 14 كومينتر

أولاً: صفق: لتقرير الخطأ هذا ، إلى حد كبير على الفور كما نريدهم. إذا كنت تأخذ الوقت الكافي لاستبدال D:\Programs بـ ProgramFiles(x86) وتثبيت الاستوديو المرئي في مسار قياسي ( Microsoft Visual Studio 12.0 AFAIK) في المرة القادمة ، فسأرشحه رسميًا لتقرير الخطأ الخاص بـ السنة: ابتسامة عريضة:

لقد تأخرت بالفعل هنا ، لكننا سنلقي نظرة سريعة ...

يبدو أن إزالة /GL (تحسين البرنامج) يجعل المشكلة تختفي ...
للتوضيح ، أحصل على segfault عند تمكين التحسين .. حسنًا ، أراك لديك نفس الشيء.
نظرًا لأنك تقول إنها جاءت مع المحاولة المضافة حديثًا ، فأنا أظن أن مشاكل حل مشكلة المكدس.
غالبًا ما يرتبط هذا بخيارات المترجم ، ولكن من السابق لأوانه قول أي شيء محدد.

سوف تفعل والتقرير مرة أخرى. لقد نفدت المساحة على SSD الخاص بي ، لذا من المحتمل أن أحتاج إلى تدوير جهاز VM

التغيير إلى /GR يفي بالغرض! - أعتقد أنه يمكنني إصلاح ذلك في الأعلام التي أمررها إلى setuptools (python).

شكرا على الاكرامية!

هممم ... يصعب القيام بذلك بعض الشيء نظرًا لأن هذه بعض الإعدادات الافتراضية التي يصعب تجاوزها - هل هناك أي فكرة عن سبب تعطل هذا الالتزام /GL ؟

نعم ، لأن الذاكرة ربما تكون أكثر تشويشًا ، لذلك ربما يكون من الأسهل أيضًا الحصول على segfaults عبر المؤشرات المتدلية أو تجاوزات المخزن المؤقت وما إلى ذلك. اول مرة. الإصلاح جار ، وسوف يكتب أكثر قليلا في العلاقات العامة.

<3 أنت الأفضل

إذا كنت ترغب في التفكير في الأمر بنفسك ، فهذا هو السطر المسيء:

sass_copy_c_string(msg_stream.str().c_str())

راجع https://github.com/sass/libsass/pull/2048 للإصلاح المقترح. شكرا على التقرير!

أتذكر شيئًا مشابهًا لهذا في بعض التعليمات البرمجية التي كتبتها منذ فترة طويلة - اعتقدت أن المعيار محمي ضد السلسلة المؤقتة التي يتم جمعها ولكن ربما لا.

يبدو أن هذا التصحيح يجعل الكود ينجح:

diff --git a/src/sass_context.cpp b/src/sass_context.cpp
index e3f34af..9105866 100644
--- a/src/sass_context.cpp
+++ b/src/sass_context.cpp
@@ -140,7 +140,8 @@ extern "C" {
       json_append_member(json_err, "message", json_mkstring(e.what()));
       json_append_member(json_err, "formatted", json_mkstring(msg_stream.str().c_str()));
       try { c_ctx->error_json = json_stringify(json_err, "  "); } catch(...) {}
-      c_ctx->error_message = sass_copy_c_string(msg_stream.str().c_str());
+      std::string s = msg_stream.str();
+      c_ctx->error_message = sass_copy_c_string(s.c_str());
       c_ctx->error_text = sass_copy_c_string(e.what());
       c_ctx->error_status = 3;
       c_ctx->output_string = 0;

يا حلو ، توصلنا إلى نفس النتيجة: د

نعم ، لقد رأيت ذلك من قبل مع إدارة الذاكرة ، حيث تم استدعاء المدمر بترتيب غريب يؤدي إلى نفس المشكلة (نفس المترجم).

آه ، الآن أتذكر ، هذا هو بالضبط سبب (AFAIR) لماذا لدينا الماكرو SASS_MEMORY_NEW لتخصيص كائنات جديدة. كان هذا هو PR: https://github.com/sass/libsass/pull/1462 ... لست متأكدًا بنسبة 100٪ ، لكن حدسي يقول إنهما يمتلكان نفس الجذر المشترك.

لطيفة التقاط لكم جميعا
في 25 أبريل 2016 9:29 صباحًا ، كتب "مارسيل جريتير" [email protected] :

مغلق # 2046 https://github.com/sass/libsass/issues/2046 عبر # 2048
https://github.com/sass/libsass/pull/2048.

-
أنت تتلقى هذا لأنك مشترك في هذا الموضوع.
قم بالرد على هذا البريد الإلكتروني مباشرة أو قم بعرضه على GitHub
https://github.com/sass/libsass/issues/2046#event -639249983

هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات