diff --git a/native/jni/src/suggest/core/dicnode/dic_node_utils.cpp b/native/jni/src/suggest/core/dicnode/dic_node_utils.cpp
index 5540b6df53035739ffdab4dc05da7998078e9352..71bcab6cba053e21720777d3a309739b39488ca2 100644
--- a/native/jni/src/suggest/core/dicnode/dic_node_utils.cpp
+++ b/native/jni/src/suggest/core/dicnode/dic_node_utils.cpp
@@ -118,7 +118,7 @@ namespace latinime {
         actualLength0 = i + 1;
     }
     actualLength0 = min(actualLength0, MAX_WORD_LENGTH);
-    memcpy(dest, src0, actualLength0 * sizeof(dest[0]));
+    memmove(dest, src0, actualLength0 * sizeof(dest[0]));
     if (!src1 || length1 == 0) {
         return actualLength0;
     }
@@ -130,7 +130,7 @@ namespace latinime {
         actualLength1 = i + 1;
     }
     actualLength1 = min(actualLength1, MAX_WORD_LENGTH - actualLength0);
-    memcpy(&dest[actualLength0], src1, actualLength1 * sizeof(dest[0]));
+    memmove(&dest[actualLength0], src1, actualLength1 * sizeof(dest[0]));
     return actualLength0 + actualLength1;
 }
 } // namespace latinime
diff --git a/native/jni/src/suggest/core/dicnode/internal/dic_node_state_output.h b/native/jni/src/suggest/core/dicnode/internal/dic_node_state_output.h
index 74eb5dfe78b9330e44e163708f519c18804db709..fc6851099a31cc1fde66698ab470e262403abc9b 100644
--- a/native/jni/src/suggest/core/dicnode/internal/dic_node_state_output.h
+++ b/native/jni/src/suggest/core/dicnode/internal/dic_node_state_output.h
@@ -17,7 +17,7 @@
 #ifndef LATINIME_DIC_NODE_STATE_OUTPUT_H
 #define LATINIME_DIC_NODE_STATE_OUTPUT_H
 
-#include <cstring> // for memcpy()
+#include <cstring> // for memmove()
 #include <stdint.h>
 
 #include "defines.h"
@@ -38,7 +38,7 @@ class DicNodeStateOutput {
     }
 
     void init(const DicNodeStateOutput *const stateOutput) {
-        memcpy(mCodePointsBuf, stateOutput->mCodePointsBuf,
+        memmove(mCodePointsBuf, stateOutput->mCodePointsBuf,
                 stateOutput->mOutputtedCodePointCount * sizeof(mCodePointsBuf[0]));
         mOutputtedCodePointCount = stateOutput->mOutputtedCodePointCount;
         if (mOutputtedCodePointCount < MAX_WORD_LENGTH) {
@@ -51,7 +51,7 @@ class DicNodeStateOutput {
         if (mergedNodeCodePoints) {
             const int additionalCodePointCount = min(static_cast<int>(mergedNodeCodePointCount),
                     MAX_WORD_LENGTH - mOutputtedCodePointCount);
-            memcpy(&mCodePointsBuf[mOutputtedCodePointCount], mergedNodeCodePoints,
+            memmove(&mCodePointsBuf[mOutputtedCodePointCount], mergedNodeCodePoints,
                     additionalCodePointCount * sizeof(mCodePointsBuf[0]));
             mOutputtedCodePointCount = static_cast<uint16_t>(
                     mOutputtedCodePointCount + mergedNodeCodePointCount);
diff --git a/native/jni/src/suggest/core/dicnode/internal/dic_node_state_prevword.h b/native/jni/src/suggest/core/dicnode/internal/dic_node_state_prevword.h
index dba57056b825c263f065b6d82c0a3ba5ba3c2440..e7108d976ee3070f0064d714081ca4806b62dd65 100644
--- a/native/jni/src/suggest/core/dicnode/internal/dic_node_state_prevword.h
+++ b/native/jni/src/suggest/core/dicnode/internal/dic_node_state_prevword.h
@@ -17,7 +17,7 @@
 #ifndef LATINIME_DIC_NODE_STATE_PREVWORD_H
 #define LATINIME_DIC_NODE_STATE_PREVWORD_H
 
-#include <cstring> // for memset()
+#include <cstring> // for memset() and memmove()
 #include <stdint.h>
 
 #include "defines.h"
@@ -62,7 +62,7 @@ class DicNodeStatePrevWord {
         mPrevWordProbability = prevWord->mPrevWordProbability;
         mPrevWordPtNodePos = prevWord->mPrevWordPtNodePos;
         mSecondWordFirstInputIndex = prevWord->mSecondWordFirstInputIndex;
-        memcpy(mPrevWord, prevWord->mPrevWord, prevWord->mPrevWordLength * sizeof(mPrevWord[0]));
+        memmove(mPrevWord, prevWord->mPrevWord, prevWord->mPrevWordLength * sizeof(mPrevWord[0]));
     }
 
     void init(const int16_t prevWordCount, const int16_t prevWordProbability,
diff --git a/native/jni/src/suggest/core/layout/proximity_info_state.cpp b/native/jni/src/suggest/core/layout/proximity_info_state.cpp
index de99e2f0cecdab81768ca044005f9d7c3b435035..40c3448ef415fcc645fa4886cadf345074eee941 100644
--- a/native/jni/src/suggest/core/layout/proximity_info_state.cpp
+++ b/native/jni/src/suggest/core/layout/proximity_info_state.cpp
@@ -18,7 +18,7 @@
 
 #include "suggest/core/layout/proximity_info_state.h"
 
-#include <cstring> // for memset() and memcpy()
+#include <cstring> // for memset() and memmove()
 #include <sstream> // for debug prints
 #include <vector>
 
@@ -285,7 +285,7 @@ float ProximityInfoState::getDirection(const int index0, const int index1) const
 }
 
 float ProximityInfoState::getMostProbableString(int *const codePointBuf) const {
-    memcpy(codePointBuf, mMostProbableString, sizeof(mMostProbableString));
+    memmove(codePointBuf, mMostProbableString, sizeof(mMostProbableString));
     return mMostProbableStringProbability;
 }