From ba8751c51ea81052367f3a3ac12e10ff1b667e50 Mon Sep 17 00:00:00 2001 From: Hiroyuki Komatsu Date: Mon, 13 May 2024 06:11:42 +0000 Subject: [PATCH] Fix a crash error in debug build. * Fixed DateRewriter::IsNDigits to exclude negative values. * https://github.com/google/mozc/issues/878 #codehealth PiperOrigin-RevId: 633099245 --- .../session/scenario/t13n_negative_number.txt | 17 +++++++++++++ src/rewriter/BUILD.bazel | 1 + src/rewriter/date_rewriter.cc | 12 +++++++-- src/rewriter/date_rewriter_test.cc | 25 +++++++++++++++++++ src/rewriter/rewriter.gyp | 1 + src/session/session_handler_scenario_test.cc | 1 + 6 files changed, 55 insertions(+), 2 deletions(-) create mode 100644 src/data/test/session/scenario/t13n_negative_number.txt diff --git a/src/data/test/session/scenario/t13n_negative_number.txt b/src/data/test/session/scenario/t13n_negative_number.txt new file mode 100644 index 000000000..f6e6ed7b1 --- /dev/null +++ b/src/data/test/session/scenario/t13n_negative_number.txt @@ -0,0 +1,17 @@ +# This file tests ConvertToHalfAscii against a negative number (F10 to -123) + +# Enable IME +SEND_KEY ON +RESET_CONTEXT +SWITCH_INPUT_MODE HIRAGANA + +################################################################################ +# Test for MS-IME keymap +SET_CONFIG session_keymap MSIME + +# Verify that input is learned. +SEND_KEYS -123 +SEND_KEY F10 +EXPECT_PREEDIT -123 + +RESET_CONTEXT diff --git a/src/rewriter/BUILD.bazel b/src/rewriter/BUILD.bazel index b01621352..9dd8d0641 100644 --- a/src/rewriter/BUILD.bazel +++ b/src/rewriter/BUILD.bazel @@ -223,6 +223,7 @@ mozc_cc_library( "//base:number_util", "//base:util", "//base:vlog", + "//base/strings:unicode", "//composer", "//converter:converter_interface", "//converter:segments", diff --git a/src/rewriter/date_rewriter.cc b/src/rewriter/date_rewriter.cc index 38204f40e..d4eb487c1 100644 --- a/src/rewriter/date_rewriter.cc +++ b/src/rewriter/date_rewriter.cc @@ -62,6 +62,7 @@ #include "base/clock.h" #include "base/japanese_util.h" #include "base/number_util.h" +#include "base/strings/unicode.h" #include "base/util.h" #include "base/vlog.h" #include "composer/composer.h" @@ -1168,8 +1169,15 @@ bool DateRewriter::ResizeSegments(const ConversionRequest &request, namespace { bool IsNDigits(const absl::string_view value, int n) { - return Util::CharsLen(value) == n && - Util::GetScriptType(value) == Util::NUMBER; + if (Util::CharsLen(value) != n) { + return false; + } + for (absl::string_view c : Utf8AsChars(value)) { + if (Util::GetScriptType(c) != Util::NUMBER) { + return false; + } + } + return true; } // Gets n digits if possible. diff --git a/src/rewriter/date_rewriter_test.cc b/src/rewriter/date_rewriter_test.cc index 65d85c8a6..9cea99955 100644 --- a/src/rewriter/date_rewriter_test.cc +++ b/src/rewriter/date_rewriter_test.cc @@ -1066,6 +1066,31 @@ TEST_F(DateRewriterTest, ConsecutiveDigitsInsertPositionTest) { } } +TEST_F(DateRewriterTest, ConsecutiveDigitsWithMinusSign) { + commands::Request request; + const config::Config config; + const composer::Composer composer(nullptr, &request, &config); + const ConversionRequest conversion_request(&composer, &request, &config); + + // Init an instance of Segments for this test. + Segments segments; + InitSegment("-123", "−123", &segments); + + Segment *segment = segments.mutable_conversion_segment(0); + // Hiragana: ー is prolonged sound mark (U+2212) + segment->add_meta_candidate()->value = "ー123"; + // Half Ascii: - is hyphen-minus (U+002D) + segment->add_meta_candidate()->value = "-123"; + // Full Ascii: − is minus (U+30FC) + segment->add_meta_candidate()->value = "−123"; + // Half Katakana: ー is half prolonged sound mark (U+FF70) + segment->add_meta_candidate()->value = "ー123"; + + // No rewrite is expected. + DateRewriter rewriter; + EXPECT_FALSE(rewriter.Rewrite(conversion_request, &segments)); +} + TEST_F(DateRewriterTest, ConsecutiveDigitsInsertPositionWithHistory) { commands::Request request; const config::Config config; diff --git a/src/rewriter/rewriter.gyp b/src/rewriter/rewriter.gyp index 83a45f428..95a33e7c9 100644 --- a/src/rewriter/rewriter.gyp +++ b/src/rewriter/rewriter.gyp @@ -85,6 +85,7 @@ '<(mozc_oss_src_dir)/base/absl.gyp:absl_strings', '<(mozc_oss_src_dir)/base/absl.gyp:absl_time', '<(mozc_oss_src_dir)/base/base.gyp:base', + '<(mozc_oss_src_dir)/base/base.gyp:base_core', '<(mozc_oss_src_dir)/base/base.gyp:config_file_stream', '<(mozc_oss_src_dir)/base/base.gyp:serialized_string_array', '<(mozc_oss_src_dir)/base/base.gyp:version', diff --git a/src/session/session_handler_scenario_test.cc b/src/session/session_handler_scenario_test.cc index 9893ba700..28627fb8f 100644 --- a/src/session/session_handler_scenario_test.cc +++ b/src/session/session_handler_scenario_test.cc @@ -146,6 +146,7 @@ const char *kScenarioFileList[] = { DATA_DIR "segment_focus.txt", DATA_DIR "segment_width.txt", DATA_DIR "suggest_after_zero_query.txt", + DATA_DIR "t13n_negative_number.txt", DATA_DIR "toggle_flick_hiragana_preedit_a.txt", DATA_DIR "toggle_flick_hiragana_preedit_ka.txt", DATA_DIR "toggle_flick_hiragana_preedit_sa.txt",