No warning (it should, 200 > 18) because the check is on length(shortstring) and not length(thevariable).
Correct, there is no warning and there should not be, because the compiler does not know that you set the length of the string to 18. This would require data flow analysis which might be done in higher optimization levels (to optimize assignment involving constants), but definitely not in the base of the language. And the memory allocated for a ShortString variable is always 256 Byte, so any access there is valid (though the length of the string will only change upon a change of StringVar[0] or an assignment of another string). The memory allocated for a String[100] variable is always 101 Byte.
And Delphi behaves the same as FPC for ShortString with High and Low. That strings aren't mentioned in the documentation for High and Low can be reported on the bug tracker.
Ho so happy that you finally appear! 
I was on a LARP, I simply had no computer access there.
Correct, there is no warning and there should not be, because the compiler does not know that you set the length of the string to 18.
And with this he does not know? 
var
Frase: String = 'Esto es una prueba';
The compiler knows that the constant
'Esto es una prueba' has a specific length, however you are assigning it to a variable (typed constant would be the same here by the way) and with that the compiler looses any knowledge about the length, because it's after all no longer a constant, but a variable and it might be changed from somewhere else. This is where my point regarding data flow analysis comes in:
if the compiler can prove that
Frase still contains the string assigned in the initialization
then (and only then) it can do things based upon this knowledge. But, again, Data Flow Analysis is
expensive. Thus it's only done in higher optimization cases and even then not everything might be covered yet (e.g. currently string constants might not be handled by the
DFA and
ConstProp optimizations, but they
could).
s := ''; // strings need to be initialized, shortstrings not
Do it? Managed types are auto-initialized to nil (and auto-destroyed when the function/program exits)
If your
String is a result variable then you should initialize it nevertheless, cause due to how string results are passed to and from functions you
might get another string in there.
writeln(ss, ' ', length(ss)); // you guess correct, it show lots of nothing with a ! somewhere
.
In the ideal world. In real world there is a significant chance to have #0 somewhere befor last character and then some OS function cancelling output on the first #0 met.
The OS functions won't cancel that, because the same functions are also used for writing binary data which can contain
#0 as well. What might happen however is that your terminal might not display data beyond the first
#0.