

課題にて `strcpy_s` を使用して文字列をコピーしなくてはならないのですが  
undefine reference to 'strcpy_s'とエラーが出てしまって実行できません。  
`strcpy` は問題なく使用することができます。

一時間ほどエラーコードなど検索してはいるのですが、力不足で解決には至っておりません。

解説等いただけると幸いです。

環境  
Ubuntu 20.04  
eclipse IDE

以下にコードを記載します。

[code]

    #include<stdio.h>
    #include<string.h>
    
    int main(){
    char A[10];
    char B[10];
    
    printf("文字列の入力\n");
    
    scanf("%s",B);
    
    printf("文字列を代入します\n");
    
    strcpy_s(A,sizeof(A),B);//実行できません
    //strcpy(A,B);//実行できます
    //strncpy(A,B,sizeof(A));//実行できます
    
    printf("A = %s",A);
    
    return 0;
    
    }
    
[/code]


CC BY-SA 4.0
2020-07-03T06:35:57.940
68237
2020-07-17T17:16:08.450
2020-07-17T17:16:08.450
3060
40918
question
c++ linux ubuntu
strcpy_s を使用すると undefine reference to 'strcpy_s' エラーが発生する


`strcpy_s()` はもともと `Microsoft Visual C / C++` にて採用された新しい関数です。そのため `MSVC`
以外の処理系には `strcpy_s()` は実装されていないのが多いようです。

[c11](/questions/tagged/c11 "'c11' のタグが付いた質問を表示") つまり C の言語仕様書 ISO/IEC
9899:2011 では確かオプショナルで採用されたのですが [gcc](/questions/tagged/gcc "'gcc'
のタグが付いた質問を表示") 開発グループはこの関数を [gcc](/questions/tagged/gcc "'gcc' のタグが付いた質問を表示")
に（今は）実装しないことを決定している様子。  
<https://stackoverflow.com/questions/40045973/>  
<https://stackoverflow.com/questions/36723946/>  
そのため [gcc](/questions/tagged/gcc "'gcc' のタグが付いた質問を表示") 開発グループが提供している libc では
`strcpy_s()` は使えないです。つまり Ubuntu の libc では `strcpy_s()`
は使えません（[gcc](/questions/tagged/gcc "'gcc' のタグが付いた質問を表示") ,
[clang](/questions/tagged/clang "'clang' のタグが付いた質問を表示") とも）

課題なら開発環境の指定もあるはず。 Visual Studio なら素直に通るはずでが、指定されていませんか？

* * *

`strcpy_s()` が Ubuntu の libc に無い、でも Ubuntu 上で使いたい、ということなら

  * 自作する
  * 既に完成しているソースコードを使わせてもらう
  * 既に完成しているライブラリを使わせてもらう

あたりの選択肢があります。既にコメントにある通り `safeclib`を使ってもよさそうだし `MSVC` から `.h` と `.c` (`.cpp`
かも未確認) をコピーしてもよさそうだし。 `strcpy_s()` の仕様解説はあちこちにあるわけでそれをもとに自作できれば最も勉強になるでしょう。

Eclipse は Windows でも動くので、動作プラットフォームは Windows10 統合開発環境は Eclipse コンパイラとライブラリは
MSVC ってのも大いにありですよ？

まあ課題なら Visual Studio 上でちゃっちゃと済ませてしまえばおしまいなので、そこまで手間（＝コスト）をかけなくてもいいんぢゃね？
とかは秘かに思ったりします。


CC BY-SA 4.0
2020-07-03T07:24:05.730
68240
2020-07-03T10:20:07.347
2020-07-03T10:20:07.347
8589
8589
68237
answer


> **どうしても** eclipse上でstrcpy_sを実装したい場合無理やりコードを通す、関数を追加する方法など ありませんでしょうか？？

774RRさんも回答されていますが、`strcpy_s`はC言語仕様に載ってはいるもののオプショナルであり、現状ではMicrosoftのVisual
Studioぐらいでしか提供されていません。  
質問者さん以外の第三者としては「課題にて`strcpy_s`を使用して文字列をコピーしなくてはならない」が実際にどのような記述で出題されているのかはわかりませんが、課題の内容をもう一度深く深く読み返すことをお勧めします。（`strcpy_s`を使用しなくてもよい、もしくはVisual
Studioの利用が必須、等の条件が課されているのではと推測しています。）

といいますのも、質問文では`printf`や`scanf`を利用されていますが、こちらも[`printf_s`](https://ja.cppreference.com/w/c/io/fprintf)や[`scanf_s`](https://ja.cppreference.com/w/c/io/fscanf)が用意されており、`strcpy_s`の使用が必須なのであれば同様に`printf_s`や`scanf_s`の使用も必須になるはずです。

また、C言語仕様に載っている`_s`系関数と、Visual
Studioで提供される`_s`系関数とでは微妙に仕様の異なる点があるため、どちらの使用が求められているのかも明確にしておいた方がいいでしょう。

* * *

なお、C言語ではなくC++言語向けですが、質問とは逆方向の機能として[セキュリティ保護されたテンプレート
オーバーロード](https://docs.microsoft.com/ja-jp/cpp/c-runtime-library/secure-
template-overloads?view=vs-2019)がVisual Studioでは提供されています。  
`_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES`を`1`に設定すると

[code]

    char A[10];
    strcpy(A, B);
    
[/code]

は`strcpy_s(A, sizeof A,
B);`としてコンパイルされるため、`strcpy_s`を持たない環境とソースコードの互換性を持たせたまま少しだけセキュリティ保護を強化することができます。


CC BY-SA 4.0
2020-07-04T05:08:20.997
68265
2020-07-04T05:08:20.997
4236
68237
answer