bugGNU Octave - Bugs: bug #67651, UBSAN error during logical...

 
 

bug #67651: UBSAN error during logical conversion from int types

Submitter:  Dmitri A. Sergatskov <dasergatskov>
Submitted:  Thu 30 Oct 2025 10:09:23 PM UTC
   
 
Category:  Octave Function Severity:  3 - Normal
Priority:  5 - Normal Item Group:  Unexpected Error or Warning
Status:  None Assigned to:  None
Originator Name:  Open/Closed:  * Open
Release:  * other Operating System:  * GNU/Linux
Fixed Release:  None Planned Release:  None
* Mandatory Fields

Post a Comment

Add a New Comment Rich Markup
   

Discussion

Fri 31 Oct 2025 02:12:27 AM UTC, comment #2: 

Now it is really attached
(file bug67651.diff )

Dmitri.
--


(file #57757)

Dmitri A. Sergatskov <dasergatskov>
Fri 31 Oct 2025 02:11:25 AM UTC, comment #1: 

I think we just need to check argument of log10 for !0, like it is done for flot formats?!


--- a/libinterp/corefcn/pr-output.cc    Tue Oct 28 10:21:54 2025 +0100
+++ b/libinterp/corefcn/pr-output.cc    Thu Oct 30 22:05:57 2025 -0400
@@ -1719,16 +1719,14 @@
   make_format (const intNDArray<TYPE>& nda)                             \
   {                                                                     \
     bool isneg = false;                                                 \
-    int digits = 0;                                                     \
+    int digits = 1;                                                     \
                                                                         \
     for (octave_idx_type i = 0; i < nda.numel (); i++)                  \
       {                                                                 \
-        int new_digits                                                  \
-          = static_cast<int>                                            \
-          (std::floor (log10 (double (abs (nda(i).value ()))) + 1));  \
-                                                                        \
-        if (new_digits > digits)                                        \
-          digits = new_digits;                                          \
+        auto abs_val = abs (nda(i).value ());                           \
+        if (abs_val > 0)                                                \
+          digits = std::max (digits, static_cast<int>                   \
+                             (std::floor (log10 (double (abs_val)) + 1))); \
                                                                         \
         if (! isneg)                                                    \
           isneg = (abs (nda(i).value ()) != nda(i).value ());           \
@@ -1752,9 +1750,10 @@
   make_format (const octave_int<TYPE>& val)                             \
   {                                                                     \
     bool isneg = false;                                                 \
-    int digits                                                          \
-      = static_cast<int>                                                \
-      (std::floor (log10 (double (abs (val.value ()))) + 1));         \
+    int digits = 1;                                                     \
+    auto abs_val = abs (val.value ());                                  \
+    if (abs_val > 0)                                                    \
+      digits = static_cast<int>(std::floor (log10 (double (abs_val)) + 1));\
                                                                         \
     isneg = (abs (val.value ()) != val.value ());                       \
                                                                         \
@@ -3055,16 +3054,13 @@
       else
         {
           bool isneg = false;
-          int digits = 0;
+          int digits = 1;

           for (octave_idx_type i = 0; i < dims.numel (); i++)
             {
-              int new_digits
-                = static_cast<int>
-                  (std::floor (log10 (double (abs (nda(i).value ()))) + 1));
-
-              if (new_digits > digits)
-                digits = new_digits;
+              auto abs_val = abs (nda(i).value ());
+              if (abs_val > 0)
+                digits = std::max (digits, static_cast<int>(std::floor (log10 (double (abs_val)) + 1)));

               if (! isneg)
                 isneg = (abs (nda(i).value ()) != nda(i).value ());


Also attached (file bug67651.diff)

Dmitri.
--

Dmitri A. Sergatskov <dasergatskov>
Thu 30 Oct 2025 10:09:23 PM UTC, original submission:  

I see UBSAN errors:

octave:1> logical([int16(2);int16(1)])
ans =

  1
  1

octave:2> logical([int16(2);int16(0)])
ans =

../libinterp/corefcn/pr-output.cc:3064:20: runtime error: -inf is outside the range of representable values of type 'int'
    #0 0x7fa9a8daca1b in void octave_print_internal_template<octave_int<unsigned char>>(std::ostream&, intNDArray<octave_int<unsigned char>> const&, bool, int) /home/dmitri/src/dev/octave/clang_ubsan/../libinterp/corefcn/pr-output.cc:3064:20
    #1 0x7fa9a8da52c7 in octave_print_internal(std::ostream&, intNDArray<octave_int<unsigned char>> const&, bool, int) /home/dmitri/src/dev/octave/clang_ubsan/../libinterp/corefcn/pr-output.cc:3190:1
    #2 0x7fa9a8da51d3 in octave_print_internal(std::ostream&, boolMatrix const&, bool, int) /home/dmitri/src/dev/octave/clang_ubsan/../libinterp/corefcn/pr-output.cc:2612:3
    #3 0x7fa9a8da541a in octave_print_internal(std::ostream&, boolNDArray const&, bool, int) /home/dmitri/src/dev/octave/clang_ubsan/../libinterp/corefcn/pr-output.cc:2624:7
    #4 0x7fa9a7c12e75 in octave_bool_matrix::print_raw(std::ostream&, bool) const /home/dmitri/src/dev/octave/clang_ubsan/../libinterp/octave-value/ov-bool-mat.cc:228:3
    #5 0x7fa9a7b52bcc in octave_base_matrix<boolNDArray>::print(std::ostream&, bool) /home/dmitri/src/dev/octave/clang_ubsan/../libinterp/octave-value/ov-base-mat.cc:490:3
    #6 0x7fa9a7d41221 in octave_value::print(std::ostream&, bool) /home/dmitri/src/dev/octave/clang_ubsan/../libinterp/octave-value/ov.h:1335:12
    #7 0x7fa9a8dc2a6a in octave::Fdisp(octave_value_list const&, int) /home/dmitri/src/dev/octave/clang_ubsan/../libinterp/corefcn/pr-output.cc:3370:9
    #8 0x7fa9a804b89c in octave::tree_evaluator::execute_builtin_function(octave_builtin&, int, octave_value_list const&) /home/dmitri/src/dev/octave/clang_ubsan/../libinterp/parse-tree/pt-eval.cc:3557:14
    #9 0x7fa9a7c26541 in octave_builtin::execute(octave::tree_evaluator&, int, octave_value_list const&) /home/dmitri/src/dev/octave/clang_ubsan/../libinterp/octave-value/ov-builtin.cc:49:13
    #10 0x7fa9a7cfdf93 in octave_function::call(octave::tree_evaluator&, int, octave_value_list const&) /home/dmitri/src/dev/octave/clang_ubsan/../libinterp/octave-value/ov-fcn.cc:86:10
    #11 0x7fa9a8a0ccfb in octave::interpreter::feval(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>> const&, octave_value_list const&, int) /home/dmitri/src/dev/octave/clang_ubsan/../libinterp/corefcn/interpreter.cc:1615:14
    #12 0x7fa9a8a0bb09 in octave::interpreter::feval(char const*, octave_value_list const&, int) /home/dmitri/src/dev/octave/clang_ubsan/../libinterp/corefcn/interpreter.cc:1600:10
    #13 0x7fa9a8dc3519 in octave::Fdisplay(octave::interpreter&, octave_value_list const&, int) /home/dmitri/src/dev/octave/clang_ubsan/../libinterp/corefcn/pr-output.cc:3536:10
    #14 0x7fa9a804ba3c in octave::tree_evaluator::execute_builtin_function(octave_builtin&, int, octave_value_list const&) /home/dmitri/src/dev/octave/clang_ubsan/../libinterp/parse-tree/pt-eval.cc:3562:16
    #15 0x7fa9a7c26541 in octave_builtin::execute(octave::tree_evaluator&, int, octave_value_list const&) /home/dmitri/src/dev/octave/clang_ubsan/../libinterp/octave-value/ov-builtin.cc:49:13
    #16 0x7fa9a7cfdf93 in octave_function::call(octave::tree_evaluator&, int, octave_value_list const&) /home/dmitri/src/dev/octave/clang_ubsan/../libinterp/octave-value/ov-fcn.cc:86:10
    #17 0x7fa9a8a0ccfb in octave::interpreter::feval(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>> const&, octave_value_list const&, int) /home/dmitri/src/dev/octave/clang_ubsan/../libinterp/corefcn/interpreter.cc:1615:14
    #18 0x7fa9a8a0bb09 in octave::interpreter::feval(char const*, octave_value_list const&, int) /home/dmitri/src/dev/octave/clang_ubsan/../libinterp/corefcn/interpreter.cc:1600:10
    #19 0x7fa9a8033a8c in octave::tree_evaluator::bind_ans(octave_value const&, bool) /home/dmitri/src/dev/octave/clang_ubsan/../libinterp/parse-tree/pt-eval.cc:4585:29
    #20 0x7fa9a80512c6 in octave::tree_evaluator::visit_statement(octave::tree_statement&) /home/dmitri/src/dev/octave/clang_ubsan/../libinterp/parse-tree/pt-eval.cc:4092:21
    #21 0x7fa9a80e025e in octave::tree_statement::accept(octave::tree_walker&) /home/dmitri/src/dev/octave/clang_ubsan/../libinterp/parse-tree/pt-stmt.h:126:8
    #22 0x7fa9a8051633 in octave::tree_evaluator::visit_statement_list(octave::tree_statement_list&) /home/dmitri/src/dev/octave/clang_ubsan/../libinterp/parse-tree/pt-eval.cc:4165:16
    #23 0x7fa9a7a0c20e in octave::tree_statement_list::accept(octave::tree_walker&) /home/dmitri/src/dev/octave/clang_ubsan/../libinterp/parse-tree/pt-stmt.h:232:8
    #24 0x7fa9a802fdf1 in octave::tree_evaluator::eval(std::shared_ptr<octave::tree_statement_list>&, bool) /home/dmitri/src/dev/octave/clang_ubsan/../libinterp/parse-tree/pt-eval.cc:1006:18
    #25 0x7fa9a8030f62 in octave::tree_evaluator::repl() /home/dmitri/src/dev/octave/clang_ubsan/../libinterp/parse-tree/pt-eval.cc:823:19
    #26 0x7fa9a8a0b9a7 in octave::interpreter::main_loop() /home/dmitri/src/dev/octave/clang_ubsan/../libinterp/corefcn/interpreter.cc:1374:22
    #27 0x7fa9a8a09651 in octave::interpreter::execute() /home/dmitri/src/dev/octave/clang_ubsan/../libinterp/corefcn/interpreter.cc:904:27
    #28 0x7fa9af5b9e04 in octave::interpreter_qobject::execute() /home/dmitri/src/dev/octave/clang_ubsan/../libgui/src/interpreter-qobject.cc:81:32
    #29 0x7fa9af70ca74 in QtPrivate::FunctorCall<std::integer_sequence<unsigned long>, QtPrivate::List<>, void, void (octave::interpreter_qobject::*)()>::call(void (octave::interpreter_qobject::*)(), octave::interpreter_qobject*, void**)::'lambda'()::operator()() const /usr/include/qt6/QtCore/qobjectdefs_impl.h:127:24
    #30 0x7fa9af70c920 in void QtPrivate::FunctorCallBase::call_internal<void, QtPrivate::FunctorCall<std::integer_sequence<unsigned long>, QtPrivate::List<>, void, void (octave::interpreter_qobject::*)()>::call(void (octave::interpreter_qobject::*)(), octave::interpreter_qobject*, void**)::'lambda'()>(void**, QtPrivate::FunctorCall<std::integer_sequence<unsigned long>, QtPrivate::List<>, void, void (octave::interpreter_qobject::*)()>::call(void (octave::interpreter_qobject::*)(), octave::interpreter_qobject*, void**)::'lambda'()&&) /usr/include/qt6/QtCore/qobjectdefs_impl.h:65:17
    #31 0x7fa9af70c853 in QtPrivate::FunctorCall<std::integer_sequence<unsigned long>, QtPrivate::List<>, void, void (octave::interpreter_qobject::*)()>::call(void (octave::interpreter_qobject::*)(), octave::interpreter_qobject*, void**) /usr/include/qt6/QtCore/qobjectdefs_impl.h:126:13
    #32 0x7fa9af70c744 in void QtPrivate::FunctionPointer<void (octave::interpreter_qobject::*)()>::call<QtPrivate::List<>, void>(void (octave::interpreter_qobject::*)(), octave::interpreter_qobject*, void**) /usr/include/qt6/QtCore/qobjectdefs_impl.h:174:13
    #33 0x7fa9af70c520 in QtPrivate::QCallableObject<void (octave::interpreter_qobject::*)(), QtPrivate::List<>, void>::impl(int, QtPrivate::QSlotObjectBase*, QObject*, void**, bool*) /usr/include/qt6/QtCore/qobjectdefs_impl.h:545:21
    #34 0x7fa9ad35682b in QObject::event(QEvent*) (/lib64/libQt6Core.so.6+0x15682b) (BuildId: 35d66cbbb8c8087e585bf990fbaf8537dbe80274)
    #35 0x7fa9ae63d97e in QApplicationPrivate::notify_helper(QObject*, QEvent*) (/lib64/libQt6Widgets.so.6+0x3d97e) (BuildId: 6125e44ec8e0cc88c6a4107ed3fb87f9350fcdfc)
    #36 0x7fa9af6ec484 in octave::octave_qapplication::notify(QObject*, QEvent*) /home/dmitri/src/dev/octave/clang_ubsan/../libgui/src/octave-qobject.cc:153:28
    #37 0x7fa9ad2f9d77 in QCoreApplication::notifyInternal2(QObject*, QEvent*) (/lib64/libQt6Core.so.6+0xf9d77) (BuildId: 35d66cbbb8c8087e585bf990fbaf8537dbe80274)
    #38 0x7fa9ad2fdb65 in QCoreApplicationPrivate::sendPostedEvents(QObject*, int, QThreadData*) (/lib64/libQt6Core.so.6+0xfdb65) (BuildId: 35d66cbbb8c8087e585bf990fbaf8537dbe80274)
    #39 0x7fa9ad611a2e  (/lib64/libQt6Core.so.6+0x411a2e) (BuildId: 35d66cbbb8c8087e585bf990fbaf8537dbe80274)
    #40 0x7fa9a05a6262  (/lib64/libglib-2.0.so.0+0x41262) (BuildId: 17844d70d31f26f7fa9495a6b49840a8dc4028bc)
    #41 0x7fa9a05af1b7  (/lib64/libglib-2.0.so.0+0x4a1b7) (BuildId: 17844d70d31f26f7fa9495a6b49840a8dc4028bc)
    #42 0x7fa9a05af362 in g_main_context_iteration (/lib64/libglib-2.0.so.0+0x4a362) (BuildId: 17844d70d31f26f7fa9495a6b49840a8dc4028bc)
    #43 0x7fa9ad61126c in QEventDispatcherGlib::processEvents(QFlags<QEventLoop::ProcessEventsFlag>) (/lib64/libQt6Core.so.6+0x41126c) (BuildId: 35d66cbbb8c8087e585bf990fbaf8537dbe80274)
    #44 0x7fa9ad307942 in QEventLoop::exec(QFlags<QEventLoop::ProcessEventsFlag>) (/lib64/libQt6Core.so.6+0x107942) (BuildId: 35d66cbbb8c8087e585bf990fbaf8537dbe80274)
    #45 0x7fa9ad42920c in QThread::exec() (/lib64/libQt6Core.so.6+0x22920c) (BuildId: 35d66cbbb8c8087e585bf990fbaf8537dbe80274)
    #46 0x7fa9ad4c70e5  (/lib64/libQt6Core.so.6+0x2c70e5) (BuildId: 35d66cbbb8c8087e585bf990fbaf8537dbe80274)
    #47 0x7fa9a0e7e463 in start_thread (/lib64/libc.so.6+0x72463) (BuildId: b1556adba4fb835078af59a0c8bb38367dc860ed)
    #48 0x7fa9a0f015ab in __GI___clone3 (/lib64/libc.so.6+0xf55ab) (BuildId: b1556adba4fb835078af59a0c8bb38367dc860ed)

SUMMARY: UndefinedBehaviorSanitizer: undefined-behavior ../libinterp/corefcn/pr-output.cc:3064:20
  1
  0


Dmitri.
--

Dmitri A. Sergatskov <dasergatskov>

 

Attached Files

Attached Files
file #57757:  bug67651.diff added by dasergatskov (3.4KiB - text/x-patch)

(Note: upload size limit is set to 16MiB, after insertion of the required escape characters.)

Attach Files:
   
   
Comment:
   

 

Dependencies

This item does not depend on any other items.

No items depend on this one.

 

Mail Notification Carbon-Copy List

Carbon-Copy List
  • -email is unavailable- added by dasergatskov (Submitted the item)
  •  

    Votes

    There are 0 votes so far. Votes easily highlight which items people would like to see resolved in priority, independently of the priority of the item set by tracker managers.

    Only group members can vote.

     

    History

    Follows 1 latest change.

    Date Changed by Updated Field Previous Value => Replaced by
    2025-10-31 dasergatskov Attached File- Added bug67651.diff, #57757

    Back to the top

    Powered by Savane 3.16.
    Corresponding source code